2014-04-04 1 views
3

아래 2 가지 검색어를 어떻게 조합하면됩니까?ActiveRecord : 부울 필드가 참이 아닌 레코드를 찾는 방법은 무엇입니까?

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 값을 가진 사용자를 얻으려고합니다. 레일 아직 구현 OR에 대한 직접적인 방법이 없기 때문에

답변

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

이 아래와 같은 쿼리를 생성합니다 : 두 번째는 더 적은 시간이 걸릴 것

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

:

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

또는

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

이 쿼리를 아래와 같이 생성합니다 첫번째 것보다.

+7

.where.not (guest : true) 쿼리는 guest의 nil 값을 무시할 수 있습니다. 즉, (guest : false)와 같을 수 있습니다. 적어도 Rails 4.1 + Postgres에 있습니다. https://github.com/rails/rails/issues/11702를 참조하십시오. –

0

당신은 항상 이러한 목표를 달성하기 위해 SQL 방법을 사용할 수 있습니다

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

사용이 : 부울 필드, 기록에 대한

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

게스트 필드가 t (true의 경우) 또는 f (false의 경우) 값으로 저장됩니다.

관련 문제