我正在尝试在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/
有什么想法?不知道如何使其发挥作用。
答案 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])。