2012-04-27 11 views
3

私は、scheduled_sessionsという名前のテーブルとinstructor_performedというブールカラムを持っており、インストラクターがクラスを教えてくれたかどうかを確認しています。Rails 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 

上の例では、真値または偽値のみを許可するように列を設定していますが、はデフォルト値falseを使用するように指示しています。

ブール値の列を設定しているときは、ほとんどの場合nullを禁止します(ただし、真にトライステート属性を必要としない限り)。デフォルト値を設定しないと、ヌル値の制約は追加できません。 )、それは私は本当ではないすべてのものを見つけるためにこれを行うことができますので:SQLは「勝ったので"instructor_performed != true"のようなSQLフラグメントの使用を奨励し、他の答えは(今削除)動作しないことを

ScheduledSession.where(instructor_performed: false) 

は注意を=または!=を使用してNULL値と一致させます。奇妙なものだが、それはルールだ。上記のRails whereクエリは限り、あなたはまだあなたが二つの値を探していることを認識しているとして、多少あなたから隠し

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

:代わりにSQLは、あなたがこれを行うことができます。

関連する問題