我渴望加载相关记录时遇到一些奇怪的行为。我在“includes”中指定了所需的关系,所有的东西都加载了四个查询。但是当我迭代选定的记录时,Rails开始为每个相关实体发出一个查询,大部分时间点击缓存。我无法在具有类似设置的测试应用中重现此问题。以下是代码的相关部分:
class Side < ActiveRecord::Base
belongs_to :photo
belongs_to :board
end
class Board < ActiveRecord::Base
belongs_to :address
has_many :sides
end
class Photo < ActiveRecord::Base
has_many :sides
end
class Address < ActiveRecord::Base
belongs_to :city
has_many :boards
end
class City < ActiveRecord::Base
has_many :addresses
end
q = Side.includes({:board => :address}, :photo).joins({:board => :address}, :projects).limit(50)
q.each {|s| s.photo}
联接是为了稍后添加的谓词。
答案 0 :(得分:0)
我认为这是因为rails是'延迟加载'的方式 - 所以在你调用Side.includes(...).limit(50)
的地方,你实际上并没有请求任何记录。可以把它想象成在模型上设置scope
。
我怀疑如果你将.all
添加到最后,它会在一个查询中加载记录。