4

インストラクターがクラスを教えたかどうかを確認するために、scheduled_sessions というテーブルと、instructor_performed というブール列があります。

そのため、インストラクターがクラスを教えていないすべての記録を見つける必要があります。しかし、これはできません。ScheduledSession.where(:instructor_performed => false)セルが空白の場合、そのレコードは返されないためです。真実ではないすべての記録が必要です。

4

1 に答える 1

20

列が true、false、または NULL の可能性があるようにinstructor_performed思われるため、次のように false または 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 を許可しません (本当にトライステート属性が必要な場合を除きます)。

ScheduledSession.where(instructor_performed: false)

SQL では NULL 値を使用したり一致"instructor_performed != true"させたりできないため、SQL フラグメントの使用を奨励した他の回答 (現在は削除されています) は機能しないことに注意してください。ちょっと変ですが、それがルールです。代わりに、SQL は次のようにします。=!=

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

上記の Railswhereクエリでは、2 つの値を検索していることを認識している限り、多少はわかりません。

于 2012-04-27T21:20:15.923 に答える