Rails:`include`与`limit`的`has_many`关系

时间:2015-10-16 15:54:32

标签: ruby-on-rails ruby-on-rails-4 activerecord

我正在使用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)

任何解决方案?

1 个答案:

答案 0 :(得分:4)

在“渴望加载协会”下的associations documentation中隐藏着一张纸条:

  

如果您急切加载与指定的:limit选项的关联,它将被忽略,返回所有关联的对象。

因此,尽管可能不是直观的行为,但它的行为与文档一样。

解决方法是急切加载有限的关联,然后单独访问。正如你所指出的那样,这并不理想,但几乎可以肯定的是,加载所有相关对象并没有限制。