加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails 3.查询不正确

发布时间:2020-12-17 01:52:31 所属栏目:百科 来源:网络整理
导读:我有一个名为scheduled_sessions的表和一个名为instructor_performed的布尔列,用于检查教师是否确实教过该课程. 所以我需要找到教师没有教授课程的所有记录.但我不能这样做:ScheduledSession.where(:instructor_performed = false)因为如果单元格为空,则不
我有一个名为scheduled_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,default: false
  ...
end

或者,您可以更改现有列的约束:

change_column_null :scheduled_session,false,false

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

当我设置布尔列时,我几乎总是不允许空值(除非我真的想要三态属性),因为它允许我这样做以找到不正确的一切:

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会在某种程度上隐藏您的查询.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读