繁体   English   中英

自定义ActiveAdmin过滤器

[英]Custom ActiveAdmin filters

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

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

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

我需要2个单独的字段作为价格,而不是ActiveAdmin默认的[lt,gt,eq]下拉列表。

我不知道我该在Rasacker身上放哪一个Arel表情?
什么是我的问题的替代解决方案? 我的意思是避免使用ransack。

UPDATE
我设法让:price过滤器正常工作:

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

但仍需要:period过滤器的帮助

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

当过滤器与模型上的列或属性不对应时,必须指定过滤器的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM