ActiveRecord:如何查找布尔字段不为真的记录?

时间:2014-04-04 15:22:43

标签: ruby-on-rails activerecord

我如何组合下面的2个查询?

    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值的用户(在一个语句中)。

3 个答案:

答案 0 :(得分:14)

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')

第二个将比第一个花费更少的时间。

答案 1 :(得分:2)

使用此:

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

对于布尔字段,记录将使用来宾字段保存为t(对于true)或f(对于false)值。

答案 2 :(得分:0)

您始终可以使用sql方式来完成此操作,因为在rails

中尚未实现OR的直接方法
u = User.where('guest = ? OR guest IS ?', false, nil).count