如何查询嵌套关系中的项?

时间:2015-09-29 04:04:10

标签: elixir phoenix-framework ecto

Phoenix Framework 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个查询是否效率低下?即。 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

我认为写一个查询更有效率(如果我错了,请纠正我!),这引出了我的第二个问题。

一旦我预加载帖子,我就不能Repo.get(post_id),因为我得到了&#34;不是可查询的&#34;错误。筛选用户帖子的正确方法是什么,以便我只获取具有我想要的特定帖子ID / ID的用户详细信息?

1 个答案:

答案 0 :(得分:3)

两种方法(两次调用Repo.get!并使用Repo.preload)将进行两次查询。您可以在调用show action时查看您的凤凰控制台来验证这一点。

但是如果有很多关联,但你只想要一个用户帖子,我会写:

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,您可以确保帖子属于用户 - 我相信您正在尝试这样做。