我们可以通过使用ActiveAdmin的ransack搜索和自定义ransacker来解决这个问题。我们需要定义一个ransacker来处理含有nil值的boolean值。以下是一个示例:
首先需要将需要搜索的字段转换为string类型:
index do
id_column
column :name
column :email
column :admin do |user|
user.admin.to_s
end
actions
end
接着,我们要在用户的model中定义ransacker:
class User < ApplicationRecord
...
ransacker :admin, formatter: proc { |v| v.nil? ? nil : v.to_b }, splat_params: true do |parent|
parent.table[:admin]
end
end
这里的ransacker将v.nil?格式化为nil值,而非原来的boolean。splat_params选项表示可以接受多个参数。
最后,在ActiveAdmin中数据筛选时,需要使用自定义的ransacker:
filter :admin, as: :select, collection: [["Yes", true], ["No", false], ["Unknown", nil]]
这里的filter将Unknown值和nil进行了对比。