我有一个名为cheduled_sessions 的表和一个名为instructor_performed 的布尔列,用于检查教师是否教过这门课。
所以我需要找到所有老师没有教课的记录。但我不能这样做:ScheduledSession.where(:instructor_performed => false)
因为如果单元格为空白,它将不会返回该记录。我只需要所有不真实的记录。
我有一个名为cheduled_sessions 的表和一个名为instructor_performed 的布尔列,用于检查教师是否教过这门课。
所以我需要找到所有老师没有教课的记录。但我不能这样做:ScheduledSession.where(:instructor_performed => false)
因为如果单元格为空白,它将不会返回该记录。我只需要所有不真实的记录。
听起来您的instructor_performed
列可以是 true、false 或 NULL,因此您需要查询 false 或 NULL,如下所示:
ScheduledSession.where(instructor_performed: [false, nil])
如果您将数据库表设置为在该列中不允许空值,则可以避免这种复杂性。您可以在迁移中创建表时指定此约束:
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
在上述所有内容中,我们将列设置为仅允许真值或假值,并且我们告诉它使用默认值假。(如果不设置默认值,则无法添加无空约束,因为现有数据违反了它。)
当我设置布尔列时,我几乎总是不允许空值(除非我真的想要三态属性),因为它让我可以这样做来查找所有不正确的内容:
ScheduledSession.where(instructor_performed: false)
请注意,其他鼓励使用 SQL 片段的答案(现已删除)"instructor_performed != true"
将不起作用,因为 SQL 不允许您使用=
或!=
匹配 NULL 值。有点奇怪,但这是规则。相反,SQL 让你这样做:
SELECT * from scheduled_sessions WHERE instructor_performed IS NULL
OR instructor_performed = FALSE;
where
只要您仍然知道您正在搜索两个值,上面的 Rails查询就会对您有所隐藏。