在Rails中急切加载的麻烦

时间:2011-04-14 09:50:57

标签: ruby-on-rails activerecord

我渴望加载相关记录时遇到一些奇怪的行为。我在“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}

联接是为了稍后添加的谓词。

1 个答案:

答案 0 :(得分:0)

我认为这是因为rails是'延迟加载'的方式 - 所以在你调用Side.includes(...).limit(50)的地方,你实际上并没有请求任何记录。可以把它想象成在模型上设置scope

我怀疑如果你将.all添加到最后,它会在一个查询中加载记录。