我怎样才能预加载关联并让它在 ecto 中返回?

How can I preload association and get it returned in ecto?

假设我有一个 User 模型 has_many Post

我获取了一个用户:

user = Repo.get(User, 1)

现在我想获取该用户的所有帖子。我找到的唯一解决方案是:

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

但是很丑。有什么 shorthand 吗?

您可以使用 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]
...
user = Repo.get(User, 1) |> preload(:posts)

shorthand适合你的情况吗

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