Ruby / Rails - 我可以使用连接表的范围(或类方法)作为WHERE子句的一部分吗?

时间:2011-07-27 22:46:43

标签: ruby-on-rails ruby-on-rails-3 activerecord scope arel

我想获取包含可购买的products的所有类别。

class Product < ActiveRecord::Base
  belongs_to :category
  scope :purchaseable, where(:available => true)
end 

class Category < ActiveRecord::Base
  has_many :products
  scope :with_purchaseable_products, ?????
end

所以,我正在尝试定义:with_purchaseable_products。这有效:

scope :with_purchaseable_products, joins(:products).where("products.available is true").group(:id).having('count(products.id) > 0')

但那不是很干。有没有办法将:purchaseable范围应用到products范围内的:with_purchaseable_products

感谢。

1 个答案:

答案 0 :(得分:36)

您应该使用合并方法

class Category < ActiveRecord::Base
  has_many :products
  scope :with_purchaseable_products, joins(:products).merge(Product.purchaseable).group(:id).having('count(products.id) > 0')
end

详细了解http://asciicasts.com/episodes/215-advanced-queries-in-rails-3