You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:02:22