gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:17:14 25 4
gpt4 key购买 nike

Phoenix 框架1.0.2

我有一个user_post_path(),因为我正在创建Users has_many Posts

在我的帖子 Controller 中我这样做:

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 some to get posts.id = 5 例如

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

预加载帖子后,我不能简单地使用 Repo.get(post_id) 因为我收到“不可查询”错误。过滤用户帖子以便我只获取具有我想要的特定帖子 ID 的用户详细信息的正确方法是什么?

最佳答案

这两种方法(调用 Repo.get! 两次并使用 Repo.preload)都会进行两次查询。您可以通过在调用 show 操作时查看 phoenix 控制台来验证这一点。

但是,如果存在多个关联,但您只想要其中一个用户帖子,我会写:

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您可以确保该帖子属于该用户 - 这就是我相信您正在尝试做的事情。

关于elixir - 如何查询嵌套关系中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com