2014-04-04 72 views
3

我該如何做以下兩個查詢的組合?ActiveRecord:如何查找boolean字段不正確的記錄?

1.9.3-p484 :003 > u = User.where(guest: false).count 
     (2.4ms) SELECT COUNT(*) FROM `users` WHERE `users`.`guest` = 0 
    => 0 
    1.9.3-p484 :004 > u = User.where(guest: nil).count 
     (2.5ms) SELECT COUNT(*) FROM `users` WHERE `users`.`guest` IS NULL 
    => 4150 

我想抓住guest列(在一個語句中)有nil或false值的用戶。

回答

12
User.where(guest: [false, nil]).count 

這將生成查詢象下面這樣:

SELECT COUNT(*) FROM "users" WHERE (("users"."guest" = 'f' OR "users"."guest" IS NULL)) 

User.where.not(guest: true).count 

這將生成查詢象下面這樣:

SELECT COUNT(*) FROM "users" WHERE ("users"."guest" != 't') 

第二個將採取較小的時間比第一個。

+7

請注意,.where.not(guest:true)查詢可能會忽略guest的零值,即可能等於where(guest:false)。至少它在Rails 4.1 + Postgres中。請參閱https://github.com/rails/rails/issues/11702 –

0

你總是可以使用SQL的方式來做到這一點,因爲是在軌道又實施了OR沒有直接的方法

u = User.where('guest = ? OR guest IS ?', false, nil).count 
0

使用此:

User.where("guest = 'f' OR guest IS NULL").count 

對於布爾字段,記錄將作爲t(對於true)或f(對於錯誤)值作爲客人字段保存。

相關問題