gpt4 book ai didi

ruby-on-rails - 当查询使用 includes 时,Rails 如何处理 has_many?

转载 作者:数据小太阳 更新时间:2023-10-29 07:36:00 25 4
gpt4 key购买 nike

如果我有一个包含许多帖子的用户模型,那么在以下场景中,Rails 将对数据库执行多少次查询?

class User
has_many :posts

# this is the main method in question...
def has_posted?
posts.any? {|p| p.posted? }
end
end

# has an attr "posted" which is a boolean
class Post
belongs_to :user
end


# some controller
users = User.includes(:posts).all


# in the view
<% users.each do |user| %>
<%= 'posted!' if user.has_posted? %>
<% end %>

当我在 has_posted? 方法中循环返回的帖子以防止多次查找每个用户的帖子表?

最佳答案

Does the fact that I'm using includes in the initial query do any magic when I loop over the returned posts in the has_posted? method to prevent multiple lookups against the posts table for each user?

是的。

如果您不使用 .includes(),您将拥有所谓的 N+1 查询。 IE。必须查找第一个项目,然后再查找 N 个。使用 .includes() 将在执行时将 post 对象预先加载到内存中。执行时间将在您调用执行查询的东西时...在您使用 has_posted? 方法的示例中,执行点将是 posts.any?

更新

但是,这里有一个更好的方法!即使用数据库查询而不是通过使用 ruby​​ 循环遍历帖子集合。所以像这样:

class User
def has_posted?
posts.is_posted.any?
end
end

class Post
scope :is_posted, -> { where(posted: true) }
end

通过这种方式,您可以让数据库只选择那些将 posted 设置为 true 的帖子。然后 .any? 会将查询变成 COUNT 查询,瞧! (在控制台上运行它并观察每种方法生成的查询。)

关于ruby-on-rails - 当查询使用 includes 时,Rails 如何处理 has_many?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901388/

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