2012-04-27 6 views
3

저는 instructed_sessions라는 테이블과 instructor_performed라는 부울 열이있어서 강사가 수업을 가르쳤는지 여부를 확인합니다.레일스 3. 사실이 아니라고 문의하십시오.

강사가 수업을 가르치지 않은 모든 기록을 찾아야합니다. 그러나 셀을 비어 있으면 해당 레코드를 반환하지 않기 때문에이 작업을 수행 할 수 없습니다 : ScheduledSession.where(:instructor_performed => false). 나는 사실이 아닌 모든 기록이 필요합니다.

답변

17

은, 허위 사실 또는 NULL이 될 수 있습니다 instructor_performed 열 같은 소리, 그래서 당신은이 같은 허위 또는 NULL를 쿼리해야 사용자가 설정하려는 경우

ScheduledSession.where(instructor_performed: [false, nil]) 

는이 복잡성을 피할 수 데이터베이스 테이블에서 해당 열의 Null 값을 허용하지 마십시오. 당신이 마이그레이션 테이블을 만들 때이 제약 조건을 지정할 수 있습니다

add_column :scheduled_session, :instructor_performed, :boolean, 
    null: false, default: false 

또는

create_table :scheduled_session do |t| 
    t.boolean :instructor_performed, null: false, default: false 
    ... 
end 

또는 기존 열에 대한 제약 조건을 변경할 수 있습니다 모두에서

change_column_null :scheduled_session, :instructor_performed, false, false 

위의 경우 true 또는 false 값만 허용하도록 열을 설정하고 있습니다 (). 기본값은 false입니다. (기본값을 설정하지 않으면 기존 데이터가 위반하기 때문에 null이 아닌 제약 조건을 추가 할 수 없습니다.)

부울 열을 설정할 때 거의 항상 null을 허용하지 않습니다. SQL은 '원하기 때문에 작동하지 않습니다 "instructor_performed != true" 같은 SQL 조각의 사용을 장려 다른 답변이 (지금은 삭제 된 것으로

ScheduledSession.where(instructor_performed: false) 

주)), 그것은 수 있기 때문에 나에게이 사실이 아니에요 모든 것을 찾을 위해 할 = 또는 !=을 사용하여 NULL 값과 일치 시키십시오. 별난 일이지만 규칙이 있습니다. 위의 레일 where 쿼리만큼 당신은 여전히 ​​당신이 두 값을 검색하는 것을 알고있는 한, 다소 당신에게서 숨겨

SELECT * from scheduled_sessions WHERE instructor_performed IS NULL 
    OR instructor_performed = FALSE; 

대신 SQL은이 작업을 수행 할 수 있습니다.