ruby-on-rails - Rails 4 - 添加范围到包含的模型

标签 ruby-on-rails ruby-on-rails-4

我有这个协会

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 中。 sourceclass_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/

相关文章:

ruby-on-rails - 如何让 Carrierwave 从 S3 中删除文件?

ruby-on-rails - 在 Ruby on Rails 中使用 pdftk 库检查复选框

mysql - SQL 提示现有字段

ruby-on-rails - rails 3.2 + OSX : Cannot install rmagick gem

ruby-on-rails - Rails 3.2 在 4.1 发布后是否仍受支持?

ruby-on-rails - 如何为 Heroku 上托管的 Rails 应用程序设置 QuotaGuard Static?

ruby-on-rails - 我如何在演示者中使用 Enumerable mixin?

ruby-on-rails - Rails 4 路由带有可选参数?

ruby-on-rails - Prawn中的Repeater PDF渲染内容两次

ruby-on-rails - 视频无法在我的本地主机中使用 Rails 应用程序使用 FFmpeg 进行转码