我怎样才能预加载关联并让它在 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])
假设我有一个 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])