我创建了一个activeadmin过滤器,它在下拉菜单中过滤表数据时有以下选择。
选择A
选择B
选择C
选择D
我想添加第五个选项F,它可以选择B或C(这是B和C的结果)。
选择A
选择B
选择C
选择D
选择F = B或C
选项存储在标题字段中名为Coupons的表中(我创建了一个具有选项F的行)。到目前为止,我试图利用搜索来完成这个技巧,但并不十分确定。
//app/admin/user.rb
filter :has_right_choice, label: 'Filter by the right choice', collection: Coupon.all, as: :select
//app/models/user.rb
ransacker :has_right_choice, :formatter => ->(title) {
if (title == 'Choice F')
Coupon.all.where("title = 'Choice B' OR title = 'Choice C'")
else
Coupon.all
end
} do |parent|
parent.table[:id]
end
但我的解决方案不起作用。是否有更好的方法而不是搜索?如果没有,有什么建议吗?
=============================================== =========================== 编辑:解决方案
选择A#可以说这个选项在优惠券表中具有id = 1
选择B#id = 2
选择C#id = 3
选择D#id = 4
选择F#id = 5
还可以说Users表有一个引用Choices表的字段choice_id。 我们修改错误代码如下:
//app/admin/user.rb
filter :choice_id_in, label: 'Filter by the right choice', collection: Coupon.all, as: :select
//app/models/user.rb
ransacker :choice_id,
:formatter => -> (coupon_id) {
if (coupon_id == "5")
ids = User.all.where("choice_id = 3 OR choice_id = 4").map(&:id)
else
ids = User.where("choice_id = ?", coupon_id).map(&:id)
end
(ids.empty?) ? ids << 0: ids #activeadmin translates the queries into IN operator, may get syntax error if empty
# id = 0 is non-existent in Users as id >= 1
ids #maybe is not needed
} do |parent|
parent.table[:id]
end
欢迎提出改进建议。感谢@berker的指导。