【问题标题】:Active Admin custom filter with ransacker带有 ransacker 的 Active Admin 自定义过滤器
【发布时间】:2015-04-30 16:03:29
【问题描述】:

我正在尝试在 ActiveAdmin 用户模型上编写自定义方法。据我了解,我必须为此使用 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/

有什么想法吗?不知道如何使它工作。

【问题讨论】:

    标签: ruby-on-rails ruby activeadmin


    【解决方案1】:

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

    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,因此它可以在每个范围查询中插入 where school_participants.id IN([所有相关学校参与者的 ID])。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 2012-04-24
      • 2019-03-17
      相关资源
      最近更新 更多