Rails中where.not查询无法包含nil属性记录的解决方法
解决Rails中where.not查询无法包含nil记录的问题
这个问题我之前也碰到过,核心原因是SQL里NULL的比较逻辑和普通值不一样——任何和NULL的比较结果都是NULL,不会被判定为true或false。所以你用where.not(skip_reason: ["full", "locked"])的时候,那些skip_reason为nil的记录根本不会被筛选进来,因为NOT (NULL IN ('full','locked'))的结果还是NULL,不会被当成符合条件的记录。
下面给你两种常用的解决方案:
方案1:使用ActiveRecord的or方法组合查询
这种方式完全用Rails的查询接口,不用写原生SQL,可读性强:
Order.where.not(skip_reason: ["full", "locked"]).or(Order.where(skip_reason: nil))
它会把两个查询条件合并:要么skip_reason不在["full", "locked"]里,要么skip_reason是nil,这样就能包含所有符合要求的订单。
方案2:直接编写原生SQL条件
如果你更习惯写SQL,这种方式更直接,同时参数化查询也能避免SQL注入风险:
Order.where("skip_reason NOT IN (?) OR skip_reason IS NULL", ["full", "locked"])
这条SQL明确指定了两种符合条件的情况,能精准筛选出你需要的记录。
用你提供的示例数据测试的话,这两种方法都会返回包含nil和"unavailable"的订单集合,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Bibek Sharma
相关产品推荐
相关产品推荐

