我如何预加载关联并将其返回到ecto?

问题描述 投票:1回答:3

假设我有一个User模型has_many Post

我抓了一个用户:

user = Repo.get(User, 1)

现在我想得到这个用户的所有帖子。我找到的唯一解决方案是:

posts = Repo.preload(user, :posts).posts

但它很难看。那有什么简写吗?

elixir ecto
3个回答
5
投票

您可以使用Ecto.assoc/2获取所有帖子的查询,然后将其传递给Repo.all/1以实际获取它们:

iex(1)> user = Repo.get(User, 1)
iex(2)> Ecto.assoc(user, :posts)
#Ecto.Query<from p in MyApp.Post, where: p.user_id == ^1>
iex(3)> Ecto.assoc(user, :posts) |> Repo.all
[debug] QUERY OK source="posts" db=2.4ms
SELECT p0."id", p0."title", p0."user_id", p0."inserted_at", p0."updated_at" FROM "posts" AS p0 WHERE (p0."user_id" = $1) [1]
...

2
投票
user = Repo.get(User, 1) |> Repo.preload([:posts])

1
投票
user = Repo.get(User, 1) |> preload(:posts)

是你的情况的简写

© www.soinside.com 2019 - 2024. All rights reserved.