修改 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 中的定义方式。

有什么方法可以覆盖 yearyear_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

然后,你现在有了一个新谓词。