我有一个名为 schedule_sessions 的表和一个名为 instructor_performed 的 bool 列,用于检查讲师是否教过这门课。

所以我需要找到所有老师没有教过课的记录。但我不能这样做: 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

在上述所有内容中,我们将列设置为仅允许 true 或 false 值,并告诉它使用默认值 false。 (不设置默认值,您无法添加无空约束,因为您现有的数据违反了它。)

当我设置 bool 列时,我几乎总是禁止空值(除非我真的想要三态属性),因为它让我可以这样做来查找所有不正确的内容:
ScheduledSession.where(instructor_performed: false)

请注意,鼓励使用 "instructor_performed != true" 之类的 SQL 片段的其他答案(现已删除)将不起作用,因为 SQL 不允许您使用 =!= 来匹配 NULL 值。有点奇怪,但这是规则。相反,SQL 让你这样做:
SELECT * from scheduled_sessions WHERE instructor_performed IS NULL
  OR instructor_performed = FALSE;

上面的 Rails where 查询对您有所隐瞒,只要您仍然知道您正在搜索两个值。

关于ruby-on-rails - Rails 3. 查询不为真,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10357841/

10-16 17:32