2014-09-30 52 views
4

我需要为属于另一个资源的日期范围创建自定义ActiveAdmin过滤器。我想根据用户完成调查的日期范围来筛选用户列表。日期范围的自定义ActiveAdmin过滤器

我已经宣布在ActiveAdmin DSL自定义过滤器,像这样:

filter :by_date_completed, label: 'By Date Completed', as: :date_range 

这让我一个很好的日期范围在主动管理的限制我的用户。都好。

我一直无法找到关于如何做到这一点的文档,但在我的用户模型中,我试图创建一个racksacker来处理过滤器。

ransacker :by_date_completed, { 
    formatter: proc { |start_date, end_date| 

     time_range = start_date..end_date 
     users = User.joins(:surveys).where(surveys: { updated_at: time_range}) 

     users = users.map(&:id) 
     users.present? ? users : nil 
     }, 
    callable: proc { |parent| 
    parent.table[:id] 
    } 
} 

但ActiveAdmin一次将日期范围传递给过滤器,所以我无法获取范围来搜索?

在这种情况下我该怎么做?我是否以错误的方式处理了整个问题?

回答

3

我认为你不需要一个自定义的搜索器。您可以过滤交叉关联。

这应该为你工作:

filter :surveys_updated_at, label: 'By Date Completed', as: :date_range 

你做的是不是,如何ransacker应该工作。我知道这是一个常见的谷歌结果,但它是错误的。

  1. 攻击者在ActiveAdmin中没有同时收到两个日期。歹徒将拨打by_date_completed_gteqby_date_completed_lteq

  2. 一个ransacker格式化程序只是格式化输入值。例如,将一个字符串转换为一个Int。

  3. racksacker的block/the callable proc需要返回放置在DB查询中的Arel/SQL字符串。

一个抽象ransacker例如:

ransacker :foo do 
    "ransacker sql code" 
end 

"SELECT * FROM bar WHERE 'ransacker sql code' = <input>" 

你洗劫应该是这样的:

"SELECT * FROM users WHERE surveys.updated_at >= START_DATE AND surveys.updated_at <= END_DATE" 
+0

感谢蒂莫:

ransacker :by_date_completed do "surveys.updated_at" end 

这应该像一个查询结束!说得通。 – 2015-08-19 04:38:31