fib*_*ono 5 ruby-on-rails ruby-on-rails-3
我对 Railsincludes方法的理解并不如我所愿,并且遇到了一个问题,希望能得到澄清。我有一个董事会模型has_many :members(has_many :lists和一个列表has_many :cards)。在下面的板控制器中,该show方法如下所示:
def show
@board = Board.includes(:members, lists: :cards).find(params[:id])
...
end
Run Code Online (Sandbox Code Playgroud)
为什么includes这里需要这个方法呢?为什么我们不能直接使用@board = Board.find(params[:id])然后通过@board.members和访问成员和列表@board.lists?我想我并没有真正明白为什么我们需要预取。如果有人能详细说明为什么这在 SQL 查询方面更有效,那就太好了。谢谢!
根据 Rails 文档:
预加载是一种使用尽可能少的查询来加载 Model.find 返回的对象的关联记录的机制。
当您只是加载一条记录并稍后查询其不同关系时,您每次都必须运行一个查询。以同样来自 Rails 文档的这个例子为例:
clients = Client.limit(10)
clients.each do |client|
puts client.address.postcode
end
Run Code Online (Sandbox Code Playgroud)
这段代码执行了 11 次数据库调用来完成一些非常琐碎的事情,因为它必须一次进行一次查找。
将上面的代码与本示例进行比较:
clients = Client.includes(:address).limit(10)
clients.each do |client|
puts client.address.postcode
end
Run Code Online (Sandbox Code Playgroud)
此代码执行数据库调用两次,因为所有必要的关联都在开始时包含在内。
额外的
最近需要注意的一点是:如果您使用关联模型执行更复杂的查询,如下所示:
Board.includes(:members, lists: :cards).where('members.color = ?', 'foo').references(:members)
您需要确保包含附加内容references(:used_eager_loaded_class)才能完成查询。
| 归档时间: |
|
| 查看次数: |
5409 次 |
| 最近记录: |