leo*_*nel 4 ruby activerecord ruby-on-rails
我有一个名为scheduled_sessions的表和一个名为instructor_performed的布尔列,用于检查教师是否确实教过该课程.
所以我需要找到教师没有教授课程的所有记录.但是我不能这样做:ScheduledSession.where(:instructor_performed => false)因为如果单元格是空白的,它将不会返回该记录.我只需要所有不正确的记录.
Rob*_*vis 20
听起来你的instructor_performed列可能是true,false或NULL,所以你需要查询false或NULL,如下所示:
ScheduledSession.where(instructor_performed: [false, nil])
Run Code Online (Sandbox Code Playgroud)
如果您将数据库表设置为禁止该列中的空值,则可以避免这种复杂性.您可以在迁移中创建表时指定此约束:
add_column :scheduled_session, :instructor_performed, :boolean,
null: false, default: false
Run Code Online (Sandbox Code Playgroud)
要么
create_table :scheduled_session do |t|
t.boolean :instructor_performed, null: false, default: false
...
end
Run Code Online (Sandbox Code Playgroud)
或者,您可以更改现有列的约束:
change_column_null :scheduled_session, :instructor_performed, false, false
Run Code Online (Sandbox Code Playgroud)
在上述所有内容中,我们将列设置为仅允许true或false值,并且我们告诉它使用默认值false.(如果不设置默认值,则无法添加无空值约束,因为现有数据违反了该约束.)
当我设置布尔列时,我几乎总是不允许空值(除非我真的想要三态属性),因为它允许我这样做以找到不正确的一切:
ScheduledSession.where(instructor_performed: false)
Run Code Online (Sandbox Code Playgroud)
请注意,鼓励使用类似SQL片段的其他答案(现已删除)"instructor_performed != true"将无效,因为SQL不允许您使用=或!=匹配NULL值.有点奇怪,但他们是规则.相反,SQL会让你这样做:
SELECT * from scheduled_sessions WHERE instructor_performed IS NULL
OR instructor_performed = FALSE;
Run Code Online (Sandbox Code Playgroud)
where只要你仍然知道你正在搜索两个值,上面的Rails 查询就会隐藏起来.
| 归档时间: |
|
| 查看次数: |
2999 次 |
| 最近记录: |