请查看以下基本关联设置(Rails 4.2.1):
class Parent < ActiveRecord::Base
has_many :kids
end
class Kid < ActiveRecord::Base
belongs_to :school
end
class School < ActiveRecord::Base
end
使用这些模型,下一个代码将按预期工作并保持关联loaded
:
parent = Parent.first
parent.kids.to_a
parent.association(:kids).loaded? # => true
但是:添加.includes(:school)
会阻止出于某种原因加载/缓存关联
parent = Parent.first
parent.kids.includes(:school).to_a
parent.association(:kids).loaded? # => false
在查看SQL日志时,我看到完全相同的选择查询,因此我希望关联被加载/缓存。
为什么会这样?
在第一个示例中, ActiveRecord预加载/缓存parent.kids
。我想了解为什么在第二个示例中无法进行includes
调用吗?
对我来说,一个理想的答案应该包括参考资料。
感谢您的帮助
我正在使用的解决方法是手动设置association.target
:
parent.association(:kids).target = parent.kids.includes(:school).to_a