gpt4 book ai didi

ruby-on-rails - Rails "includes"方法和避免 N+1 查询

转载 作者:行者123 更新时间:2023-12-04 02:20:03 27 4
gpt4 key购买 nike

我不懂 Rails includes方法以及我想要的,我遇到了一个我希望澄清的问题。我有一个 型号has_many :membershas_many :lists (和一个列表 has_many :cards )。在以下板卡 Controller , show方法如下:

def show
@board = Board.includes(:members, lists: :cards).find(params[:id])
...
end

为什么是 includes这里需要方法吗?为什么我们不能直接使用 @board = Board.find(params[:id])然后通过 @board.members 访问成员和列表和 @board.lists ?我想我不太明白为什么我们需要预取。如果有人能详细说明为什么这在 SQL 查询方面更有效,那就太棒了。谢谢!

最佳答案

根据 Rails 文档:

Eager loading is the mechanism for loading the associated records of the objects returned by Model.find using as few queries as possible.



当您简单地加载一条记录并稍后查询其不同的关系时,您必须每次都运行一个查询。以这个例子,同样来自 Rails 文档:
clients = Client.limit(10)

clients.each do |client|
puts client.address.postcode
end

这段代码执行了 11 次数据库调用来做一些非常简单的事情,因为它必须一次执行一次查找。

将上面的代码与此示例进行比较:
clients = Client.includes(:address).limit(10)

clients.each do |client|
puts client.address.postcode
end

这段代码执行了 2 次数据库调用,因为所有必要的关联都在开始时就包括在内。

Here's a link to the pertinent section of the Rails docs.

额外

最近要注意的一点:如果您使用关联模型执行更复杂的查询,如下所示:
Board.includes(:members, lists: :cards).where('members.color = ?', 'foo').references(:members)
您需要确保包含附加的 references(:used_eager_loaded_class)以完成查询。

关于ruby-on-rails - Rails "includes"方法和避免 N+1 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31149850/

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