[英]Active Admin custom filter with ransacker
我正在嘗試在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/
任何想法? 不知道如何使它工作。
解決方案是在過濾器中提供應轉換為日期范圍的值:
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])。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.