Rails查询:在where条件中添加OR is NULL的实现方法
解决方案
你可以直接在where子句中通过SQL条件或者Arel来组合OR逻辑,无需使用.or方法重复整个查询:
方法1:使用原生SQL条件
如果year_period是时间范围类型(比如Date.today.beginning_of_year..Date.today.end_of_year),可以直接用SQL的OR拼接条件,借助占位符避免SQL注入:
Investor.left_join(:disbursements) .where("disbursements.disbursed_at IS NULL OR disbursements.disbursed_at BETWEEN ? AND ?", year_period.begin, year_period.end)
方法2:使用Arel(推荐,更贴合Rails风格)
通过Arel构建条件,既保证安全性,又能让Rails自动处理时间范围的SQL转换:
# 获取Disbursement表的Arel对象 disbursements_table = Disbursement.arel_table Investor.left_join(:disbursements) .where( disbursements_table[:disbursed_at].eq(nil) .or(disbursements_table[:disbursed_at].in(year_period)) )
这两种方式都能在同一个where中实现「disbursed_at为空 或 在指定时间范围」的筛选,不需要重复编写整个查询逻辑,适配原查询语句较长的场景。
内容的提问来源于stack exchange,提问作者Leticia Esperon
相关产品推荐
相关产品推荐

