如何查询嵌套关系中的项目?
How to query an item in a nested relationship?
凤凰框架 1.0.2
我有一个 user_post_path()
因为我正在制作 Users
has_many
Posts
.
在我的帖子控制器中我这样做:
def show(conn, %{"id" => id, "user_id" => user_id}) do
post = Post |> Repo.get!(id)
user = User |> Repo.get!(user_id)
render(conn, :index, post: post, user: user)
end
在我的 post/show.html
我有:
<%= link "Edit", to: user_post_path(@conn, :edit, @user, @post) %>
第一个问题,写2条查询效率低吗? IE。
Repo.get!(id)
和 Repo.get!(user_id)
还是这样写效率更高:
user_with_post = User |> Repo.get!(user_id) |> Repo.preload [:posts] |> #now do something to get posts.id = 5 for example
我认为写一个查询更有效,(如果我错了请纠正我!),这引出了我的第二个问题。
一旦我预加载 posts,我就不能简单地 Repo.get(post_id)
因为我得到 "not a queryable" 错误。过滤用户 post 的正确方法是什么,以便我只获得我想要的特定 post id/ids 的用户详细信息?
这两种方法(调用 Repo.get!
两次并使用 Repo.preload
)都会进行两次查询。您可以在调用 show 操作时查看您的 phoenix 控制台来验证这一点。
但是,如果有很多关联,但您只想要其中一个用户 post,我会写:
def show(conn, %{"id" => id, "user_id" => user_id}) do
user = User |> Repo.get!(user_id)
post = assoc(user, :posts) |> Repo.get!(post_id)
render(conn, :index, post: post, user: user)
end
使用 assoc/2 可以确保 post 属于用户 - 这就是我相信你正在尝试做的事情。
凤凰框架 1.0.2
我有一个 user_post_path()
因为我正在制作 Users
has_many
Posts
.
在我的帖子控制器中我这样做:
def show(conn, %{"id" => id, "user_id" => user_id}) do
post = Post |> Repo.get!(id)
user = User |> Repo.get!(user_id)
render(conn, :index, post: post, user: user)
end
在我的 post/show.html
我有:
<%= link "Edit", to: user_post_path(@conn, :edit, @user, @post) %>
第一个问题,写2条查询效率低吗? IE。
Repo.get!(id)
和 Repo.get!(user_id)
还是这样写效率更高:
user_with_post = User |> Repo.get!(user_id) |> Repo.preload [:posts] |> #now do something to get posts.id = 5 for example
我认为写一个查询更有效,(如果我错了请纠正我!),这引出了我的第二个问题。
一旦我预加载 posts,我就不能简单地 Repo.get(post_id)
因为我得到 "not a queryable" 错误。过滤用户 post 的正确方法是什么,以便我只获得我想要的特定 post id/ids 的用户详细信息?
这两种方法(调用 Repo.get!
两次并使用 Repo.preload
)都会进行两次查询。您可以在调用 show 操作时查看您的 phoenix 控制台来验证这一点。
但是,如果有很多关联,但您只想要其中一个用户 post,我会写:
def show(conn, %{"id" => id, "user_id" => user_id}) do
user = User |> Repo.get!(user_id)
post = assoc(user, :posts) |> Repo.get!(post_id)
render(conn, :index, post: post, user: user)
end
使用 assoc/2 可以确保 post 属于用户 - 这就是我相信你正在尝试做的事情。