渴望在“双向”装载

时间:2011-01-25 09:52:14

标签: ruby-on-rails ruby-on-rails-3 eager-loading

急切加载并不像我预期的那样有效。

我有产品 has_many 变种,当然每个变体属于产品

我使用这样的代码来加载产品及其所有变体:

products = Product.includes(:variants)

这样做:所有产品和所有变体只加载了两个查询。但是,未加载每个变体的产品,因此以下代码会导致另一个SQL查询:

puts products[0].variants[0].product.title

为什么会这样,我该如何解决?我认为Product.includes(:variants => :product)会起作用,但它会导致一个额外的大而且不必要的SQL查询,因为产品数据已经可用。

1 个答案:

答案 0 :(得分:1)

Active Record只会在您指定的级别上加载关联。从它的角度来看,variant.product将被视为另一种关联程度。所以,如果你想加载它,你必须这样做:

products = Product.includes({:variants => :product})