我有一张费用表。它有一列invoice_id。
我想要2个范围 - 一个用于计费费用,另一个用于未计费。 我以为我可以测试一下invoice_id是否为零。
scope :notbilled, where(:invoice_id == nil)
scope :billed, where(:invoice_id != nil)
但是,这不起作用。
有什么想法吗?
谢谢!
答案 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节)