自定义ActiveAdmin过滤器

时间:2016-02-17 13:46:29

标签: ruby-on-rails activeadmin arel ransack

我正在使用ActiveAdmin而我正在尝试实现自己的过滤器。

  1. 按天/周/月过滤
  2. 按价格(虚拟属性)过滤,大于和小于
  3. businesses.rb

    filter :period_eq, as: :select, collection: [['day', 'day'], ['week', 'week']]
    filter :price_lteq, as: :string
    filter :price_gteq, as: :string
    

    business.rb

    ransacker :period,
      formatter: -> period {
        from = {
          day: Time.now.beginning_of_day,
          week: 1.week.ago.beginning_of_day,
          month: 1.month.ago.beginning_of_day,
          year: 1.year.ago.beginning_of_day,
        }[period.to_sym]
        Business.where('updated_at >= ?', from).pluck(:id)
      }, splat_params: true do |parent|
        parent.table[:id]
    end
    ransacker :price do |parent|
      # equivalent to Business.where('(owner_price + comission) >= ?', price)
    end
    

    我需要两个单独的字段来代价,而不是ActiveAdmin默认[lt,gt,eq]下拉列表。

    我无法想象,我应该把这个Arel表达放入洗劫者身上? 什么是我的问题的替代解决方案?我的意思是避免使用hansack。

    更新
    我设法得到:价格过滤器工作:

    filter :price, as: :numeric_range
    
    ransacker :price,
      formatter: -> price {
        price.to_s.gsub /[\u00A0\s]+/, ''
      }, splat_params: true do |parent|
        Arel::Nodes::InfixOperation.new('+',
          parent.table[:comission], parent.table[:owner_price])
    end
    

    但仍然需要帮助:期间过滤器

1 个答案:

答案 0 :(得分:0)

将我的评论移至答案; - )

当过滤器与模型上的列或属性不对应时,您必须指定过滤器的as选项:

filter :price_lteq, as: :string

如果您正在寻找范围,ActiveAdmin会numeric_range。尝试这样的事情:

filter :period, as: :select, collection: [['day', 'day'], ['week', 'week']]
filter :price, as: :numeric_range

ransacker :period, (period_name) -> {
  {
    day: Time.now.beginning_of_day,
    week: 1.week.ago.beginning_of_day,
    month: 1.month.ago.beginning_of_day,
    year: 1.year.ago.beginning_of_day,
  }[period.to_sym]
} do |parent|
  parent.table[:updated_at]
end

ransacker :price do |parent|
  formatter: -> price {
    price.to_s.gsub /[\u00A0\s]+/, ''
  }, splat_params: true do |parent|
    Arel::Nodes::InfixOperation.new('+', parent.table[:comission], parent.table[:owner_price])
end