修改 Ransack not_in 查询以在字段为 nil 时包含
Modify Ransack not_in query to include when field is nil
我正在这样查询我的模型:
MyModel.search(year_not_in: [2000, 2010, 2015])
但我只能从 MyModel
返回结果,其中 year
不是 nil
。例如,查询命中 MyModel.year = 1999
但不命中 MyModel.year = nil
。我希望 nil
不在那个数组中,但也许这就是它在 SQL 中的定义方式。
有什么方法可以覆盖 year
或 year_not_in
掠夺者以添加上述条件?
我能够在不覆盖的情况下解决这个问题,尽管我仍然对如何做到这一点很感兴趣。像这样加入语句是我的解决方案:
.search(m: 'or', year_not_in: [2000, 2010, 2015], year_null: true)
首先:此解决方案使用 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
然后,你现在有了一个新谓词。
我正在这样查询我的模型:
MyModel.search(year_not_in: [2000, 2010, 2015])
但我只能从 MyModel
返回结果,其中 year
不是 nil
。例如,查询命中 MyModel.year = 1999
但不命中 MyModel.year = nil
。我希望 nil
不在那个数组中,但也许这就是它在 SQL 中的定义方式。
有什么方法可以覆盖 year
或 year_not_in
掠夺者以添加上述条件?
我能够在不覆盖的情况下解决这个问题,尽管我仍然对如何做到这一点很感兴趣。像这样加入语句是我的解决方案:
.search(m: 'or', year_not_in: [2000, 2010, 2015], year_null: true)
首先:此解决方案使用 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
然后,你现在有了一个新谓词。