簡體   English   中英

帶有搜索引擎的Active Admin自定義過濾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM