1

我正在使用 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'

我希望这两个条件都与导致一个空白数组作为响应,而不是我得到所有 category_2 对象。

如果不使用作用域,而是使用类方法,例如:

def self.category_1
  self.where(:category => 'category_1')
end

我得到了预期的结果。

现在问题来了:这是预期的 Rails 行为吗?我的条件应该被属性的最后调用范围替换,还是应该像其他添加 WHERE 条件的范围一样添加到 AND 子句中?

4

1 回答 1

0

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

scope :category_1, lambda { where(:category => 'category_1') }
scope :category_2, lambda { where(:category => 'category_2') }
于 2012-09-20T21:21:13.370 回答