我正在使用Rails 4.2。我有3个这样的表:
bundle
我的目标是选择一些集合并使用class Collection < ActiveRecord::Base
has_many :shares
has_many :images, through: :shares
has_many :latest_images, -> { order(created_at: :desc).limit(10) }, class_name: 'Image', through: :shares, source: :image
end
class Share < ActiveRecord::Base
belongs_to :image
belongs_to :collection
end
class Image < ActiveRecord::Base
has_many :shares
has_many :collections, through: :shares
end
关系预加载每个集合的前10张最新卡片。
如果我这样做:
latest_images
问题是latest_images将包含所有卡片,不仅包括最后10张(即使有collections = Collection.where(some_condition).includes(:latest_images)
)
limit(10)
相反,如果我在加载集合后添加collections.first.latest_images.count # => more than 10!!!
,我将遇到N + 1查询问题:
limit(10)
任何解决方案?
答案 0 :(得分:4)
在“渴望加载协会”下的associations documentation中隐藏着一张纸条:
如果您急切加载与指定的:limit选项的关联,它将被忽略,返回所有关联的对象。
因此,尽管可能不是直观的行为,但它的行为与文档一样。
解决方法是不急切加载有限的关联,然后单独访问。正如你所指出的那样,这并不理想,但几乎可以肯定的是,加载所有相关对象并没有限制。