急切加载并不像我预期的那样有效。
我有产品 has_many 变种,当然每个变体属于产品。
我使用这样的代码来加载产品及其所有变体:
products = Product.includes(:variants)
这样做:所有产品和所有变体只加载了两个查询。但是,未加载每个变体的产品,因此以下代码会导致另一个SQL查询:
puts products[0].variants[0].product.title
为什么会这样,我该如何解决?我认为Product.includes(:variants => :product)
会起作用,但它会导致一个额外的大而且不必要的SQL查询,因为产品数据已经可用。
答案 0 :(得分:1)
Active Record只会在您指定的级别上加载关联。从它的角度来看,variant.product
将被视为另一种关联程度。所以,如果你想加载它,你必须这样做:
products = Product.includes({:variants => :product})