我正在使用rails 3.2.8编写简单的作用域,其中我使用数据库中的类别列进行过滤,例如:
scope :category_1, where(:category => 'category_1')
scope :category_2, where(:category => 'category_2')
然后当我尝试使用两个范围从数据库中获取对象时使用:
Model.category_1.category_2.all
活动记录而不是生成where子句,如:
WHERE category = 'category_1' AND category = 'category_2'
生成一个where子句,如:
WHERE category = 'category_2'
我希望两个条件ANDed导致一个空白数组作为响应,而不是我得到所有category_2对象。
如果不使用范围,则使用类方法,如:
def self.category_1
self.where(:category => 'category_1')
end
我得到了预期的结果。
现在问题是:这是预期的导轨行为吗?我的条件应该被最后一个被调用的属性替换,还是应该添加到AND子句中,就像添加WHERE条件的其他范围一样?
答案 0 :(得分:0)
ActiveRecord试图变得聪明,因为它知道条件不可能重叠(类似于一组散列键)。尝试将范围包装在lambda中以避免这种情况:
scope :category_1, lambda { where(:category => 'category_1') }
scope :category_2, lambda { where(:category => 'category_2') }