替换相同属性的Rails 3.2范围而不是链接

时间:2012-09-20 18:51:19

标签: ruby-on-rails ruby-on-rails-3.2

我正在使用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条件的其他范围一样?

1 个答案:

答案 0 :(得分:0)

ActiveRecord试图变得聪明,因为它知道条件不可能重叠(类似于一组散列键)。尝试将范围包装在lambda中以避免这种情况:

scope :category_1, lambda { where(:category => 'category_1') }
scope :category_2, lambda { where(:category => 'category_2') }