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

big*_*ato 3 activerecord ruby-on-rails

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

    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
Run Code Online (Sandbox Code Playgroud)

我想抓住guest列中具有nil或false值的用户(在一个语句中).

Che*_*ian 14

User.where(guest: [false, nil]).count
Run Code Online (Sandbox Code Playgroud)

这将生成如下查询:

SELECT COUNT(*) FROM "users" WHERE (("users"."guest" = 'f' OR "users"."guest" IS NULL))
Run Code Online (Sandbox Code Playgroud)

要么

User.where.not(guest: true).count
Run Code Online (Sandbox Code Playgroud)

这将生成如下查询:

SELECT COUNT(*) FROM "users" WHERE ("users"."guest" != 't')
Run Code Online (Sandbox Code Playgroud)

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

  • 注意,.where.not(guest:true)查询可能会忽略guest的nil值,即可能等于where(guest:false).至少它在Rails 4.1 + Postgres中.请参阅https://github.com/rails/rails/issues/11702 (8认同)