Rails范围测试为零

时间:2012-05-18 22:46:18

标签: ruby-on-rails

我有一张费用表。它有一列invoice_id。

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

scope :notbilled, where(:invoice_id == nil)
scope :billed, where(:invoice_id != nil)

但是,这不起作用。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:12)

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

scope :notbilled, where(:invoice_id => nil)

第二个要求你使用原始的sql:

scope :billed, where('invoice_id is not null')

你也可以跳转到第二个的arel以避免编写原始sql,但这是一个高级主题,并且最终会比原始sql更不易读。

使用直接相等是行不通的,因为这些表达式会立即求值,并且会变成它们的布尔值,因为不涉及变量,所以它们会被解释为

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

答案 1 :(得分:4)

更新了Rails 4的答案:

scope :notbilled, where(invoice_id: nil)
scope :billed, where.not(invoice_id: nil)

这是ActiveRecord 4中添加的新功能。

文档:http://edgeguides.rubyonrails.org/active_record_querying.html(搜索" NOT条件",目前第2.4节)