我有这个协会
class Product
has_many :categorizations
has_many :categories, through: :categorization
scope :first_five, lambda { limit(5) }
end
class Category
has_many :categorizations
has_many :products, through: :categorization
end
对于每个类别,我希望使用上面定义的 first_ Five
范围获取前五个产品。
为了最小化数据库请求,我使用includes()
@categories = Category.includes(:products).all
但是如何将范围添加到产品
?我不想使用 default_scope
因为它会影响一切。
我在 Google 上找不到它(或者我只是找不到正确的搜索词)
谢谢
最佳答案
Rails 4 中 lambda 作用域的新语法是:
scope :first_five, -> { limit(5) }
要将 AR 查询中的产品限制为五个,您可以执行以下操作:
@categories = Category.includes(:products).merge(Product.first_five).all
merge(Product.first_ Five)
将在有限的五个产品上添加一个左外连接
。
更新:
上面注释的代码将限制类别。解决原始问题的一个可能的解决方案可能是添加另一个 has_many...through
关系,在 Category
模型上将其称为 limited_products
,如下所示:
has_many :limited_products, -> { limit(5) },
through: :products,
source: :categorizations
使用此 Categeory.includes(:limited_products)
应该会产生将产品限制为 5
的预期结果。
按照您的建议,将 source: :categorizations
选项添加到新添加的关联 limited_products
中。 source
和 class_name
应该是同义词。由于我们定义的关联是一个 has_many...through
关联,它忽略 class_name
选项,因此我们应该使用 :source
选项而不是 :class_name
选项。 has_many...through
关系中忽略的其他关联选项有 :primary_key
和 :foreign_key
。
关于ruby-on-rails - Rails 4 - 添加范围到包含的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22292149/