使用ransack

时间:2016-09-28 20:02:29

标签: filter activeadmin ransack

我创建了一个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的指导。

0 个答案:

没有答案