Ruby on rails 零的Rails范围测试

Ruby on rails 零的Rails范围测试,ruby-on-rails,Ruby On Rails,我有一张费用表。它有一个列invoice\u id 我想要2个范围-一个用于计费费用,一个用于未计费。 我想我可以测试一下发票id是否为零 scope :notbilled, where(:invoice_id == nil) scope :billed, where(:invoice_id != nil) 但是,这不起作用 有什么想法吗 谢谢 对于第一个,您需要使用哈希语法: scope :notbilled, where(:invoice_id => nil) 第二个要求您使用原始

我有一张费用表。它有一个列invoice\u id

我想要2个范围-一个用于计费费用,一个用于未计费。 我想我可以测试一下发票id是否为零

scope :notbilled, where(:invoice_id == nil)
scope :billed, where(:invoice_id != nil)
但是,这不起作用

有什么想法吗


谢谢

对于第一个,您需要使用哈希语法:

scope :notbilled, where(:invoice_id => nil)
第二个要求您使用原始sql:

scope :billed, where('invoice_id is not null')
为了避免编写原始sql,您还可以跳转到arel中进行第二次编写,但这是一个高级主题,最终的可读性将不如原始sql

使用直接相等将不起作用,因为这些表达式会立即求值,并转换为布尔等价表达式,因为不涉及任何变量,因此它们将被解释为

scope :notbilled, where(false)
scope :billed, where(true)

从Rails 4开始更新答案:

scope :notbilled, where(invoice_id: nil)
scope :billed, where.not(invoice_id: nil)
这是ActiveRecord4中添加的新功能


文档:(搜索“非条件”,当前为第2.4节)

我将其更改为您的建议。但是,使用
-我得到了#的未定义方法“notbilled”;为什么调用
billed
会产生关于
notbilled
的错误?作用域不用于数组-它们用于关系
@expenses
是查询的结果集,因此对其调用作用域的时间已经过去。抱歉,我正在查看第二个索引。这是从这个声明。您能说明如何分配
@expenses
吗?这就是问题的根源。我非常感谢你的帮助。但是,我是新来的罗。分配@费用意味着什么?代码来自索引页。