急切加载如何工作?我的意思是我知道它的作用是什么,但我可以通过做一个'侧'查询来复制它吗?

Inc*_*982 1 activerecord ruby-on-rails eager-loading ruby-on-rails-3

有没有办法进行第二次查询并复制预先加载的功能?让我们说一个真实的基本例子.一个人有很多车,一辆车有很多零件..

通常情况下,你会说:

person.cars.includes(:parts)
Run Code Online (Sandbox Code Playgroud)

我真的不明白这是做什么的......它只是在内存中加载其他对象吗?它们是否在这一点上与每辆车相关联,然后只是共享密钥?如果只是共享密钥..我可以在内存中加载这些"部件"并在不明确调用"包含"的情况下访问它们吗?例如..类似于:

cars = person.cars
cars_id_array << insert cars ids here
parts = Parts.where(:user_id => person_id, "car_id IN cars_id_array") (just an example)
Run Code Online (Sandbox Code Playgroud)

在这种情况下(假设我做了写代码,我确定我没有..我可以去car1.parts,car2.parts,那些部分是否已经加载到内存中?

如果不是,那么渴望加载的是什么?

Mar*_*bot 5

渴望加载正在做与你正在做的事情非常相似的事情,但除了简单地查询数据库之外,它还建立了关系.从具有相关模型的数据库中检索模型时,通常会根据需要加载相关模型.指南中的示例是:

clients = Client.limit(10)

clients.each do |client|
  puts client.address.postcode
end
Run Code Online (Sandbox Code Playgroud)

当您执行第一个查询时,会调用数据库来获取十个客户端.当你遍历他们得到了与客户端的地址(这大概生活在一个不同的表)相关联的邮政编码,你需要做的10个查询,抓住正确的地址.通过使用预先加载,您可以在两个查询中完成整个操作(在封面下处理).

clients = Client.includes(:address).limit(10)
Run Code Online (Sandbox Code Playgroud)

这抓住了十个客户端,然后执行另一个查询(类似于您的查询)来获取client_id数组中的地址.然后将它们驻留在内存中,并保持关系,因此您无需再进行数据库调用即可获取它们.

如果你试图通过单独加载它们来复制它:

clients = Client.limit(10)
addresses = Address.where("client_id in [my ID array]")
clients.each do |client|
  puts client.address.postcode
end
Run Code Online (Sandbox Code Playgroud)

您仍然要为每个地址访问数据库,因为这些对象除了通过数据库ID之外没有相互关联.对象已加载,但不会在它们之间创建关系.