带有搜索引擎的Active Admin自定义过滤器

时间:2015-04-30 16:03:29

标签: ruby-on-rails ruby activeadmin

我正在尝试在ActiveAdmin Users模型上编写自定义方法。我的理解是我必须使用ransacker。

我想要发生的是有一个选择,其中显示在UI下拉列表中,如下所示:

Aug 2010-Aug 2011
Aug 2011-Aug 2012
Aug 2012-Aug 2013
Aug 2013-Aug 2014
Aug 2014-Aug 2015
Aug 2015-Aug 2016

以下是我需要从中获取信息的表格。

Users
------
id (int)

school_participants
-------------------
user_id (int)
start_date (datetime)

SchoolParticipant 属于用户,用户有很多 school_participants。

我最初尝试在ActiveAdmin过滤器中执行类似的操作

  filter :participant_schools_start_date, :label => "School Year", :as => :select, :collection => [['2010', '2010-08-15'], ['2011', '2013-08-15']]

只是为了看看我们在表单中得到了什么,但是我需要一种在选择字段中传递范围的方法,但显然,你一次只能传递一个值。此数组中的第一个元素(2010)显示在UI中,第二个元素(2010-08-15)是作为值传递的内容。

基本上我正试图在这些范围之间进行查询

**ON Selection in a drop down**                   **Query I want**
         Aug 2010-Aug 2012 a query between   2010-08-15 to 2011-08-15
         Aug 2011-Aug 2012                   2011-08-15 to 2012-08-15
         Aug 2012-Aug 2013                   2012-08-15 to 2013-08-15
         Aug 2013-Aug 2014                   2013-08-15 to 2014-08-15
         Aug 2014-Aug 2015                   2014-08-15 to 2015-08-15
         Aug 2015-Aug 2016                   2015-08-15 to 2016-08-15 

我尝试使用我发现的一些资源来玩procs和lambdas

http://nikhgupta.com/code/activeadmin/custom-filters-using-ransacker-in-activeadmin-interfaces

http://cavewall.jaguardesignstudio.com/2014/05/01/activeadmin-filters-with-ransack/

有什么想法?不知道如何使其发挥作用。

1 个答案:

答案 0 :(得分:0)

解决方案是在过滤器中提供一个值,该值应转换为日期范围:

filter :school_participants_schoolyear_in, as: :select, collection: %w[Aug 2013-Aug 2014 Aug 2014-Aug 2015 Aug 2015-Aug 2016 Aug 2016-Aug 2017]

然后在ransacker中转换该值(在学校参与者模型中定义):

ransacker :schoolyear,
        formatter: proc { |range_string|
          dates = range_string.split('-').map{|d| (Date.parse(d) + 15.days).to_date}
          date_range = dates.first...dates.last
          results = SchoolParticipants.where(start_date: date_range).pluck(:id)
          results.present? ? results : nil
        }, splat_params: true do |parent|
  parent.table[:id]
end

这将导致额外的查询以查找SchoolParticipants的ID,以便它可以在每个范围查询中插入school_participants.id IN([相关学校参与者的所有ID])。