【问题标题】:Modify Ransack not_in query to include when field is nil修改 Ransack not_in 查询以包含字段为 nil 时
【发布时间】:2015-10-30 19:38:17
【问题描述】:
我正在像这样查询我的模型:
MyModel.search(year_not_in: [2000, 2010, 2015])
但我只在year 不是nil 的情况下从MyModel 返回结果。例如,查询命中MyModel.year = 1999,但未命中MyModel.year = nil。我希望nil 不在该数组中,但也许这就是它在 SQL 中的定义方式。
有没有办法我可以覆盖year 或year_not_in ransacker 以添加上述条件?
【问题讨论】:
标签:
sql
ruby-on-rails
arel
ransack
【解决方案1】:
我能够在不覆盖的情况下解决这个问题,但我仍然对如何做到这一点感兴趣。像这样加入语句是我的解决方案:
.search(m: 'or', year_not_in: [2000, 2010, 2015], year_null: true)
【解决方案2】:
首先:此解决方案使用ransack (2.4.2) 和rails 6.1.3 进行测试
为此,GEM ransack 给我们的解决方案是添加一个新的谓词:
如果您想添加自己的自定义 Ransack 谓词
not_in_or_null
你可以这样做:
“config/initializers/ransack.rb”
你添加这个
Ransack.configure do |config|
config.add_predicate 'not_in_or_null', arel_predicate: 'not_in_or_null'
end
module Arel
module Predications
def not_in_or_null(other)
left = not_in(other)
right = eq(nil)
left.or(right)
end
end
end
然后,你现在有了一个新的谓词。