2014-09-30 79 views
4

我需要爲屬於另一個資源的日期範圍創建自定義ActiveAdmin過濾器。我想根據用戶完成調查的日期範圍來篩選用戶列表。日期範圍的自定義ActiveAdmin過濾器

我已經宣佈在ActiveAdmin DSL自定義過濾器,像這樣:

filter :by_date_completed, label: 'By Date Completed', as: :date_range 

這讓我一個很好的日期範圍在主動管理的限制我的用戶。都好。

我一直無法找到關於如何做到這一點的文檔,但在我的用戶模型中,我試圖創建一個racksacker來處理過濾器。

ransacker :by_date_completed, { 
    formatter: proc { |start_date, end_date| 

     time_range = start_date..end_date 
     users = User.joins(:surveys).where(surveys: { updated_at: time_range}) 

     users = users.map(&:id) 
     users.present? ? users : nil 
     }, 
    callable: proc { |parent| 
    parent.table[:id] 
    } 
} 

但ActiveAdmin一次將日期範圍傳遞給過濾器,所以我無法獲取範圍來搜索?

在這種情況下我該怎麼做?我是否以錯誤的方式處理了整個問題?

回答

3

我認爲你不需要一個自定義的搜索器。您可以過濾交叉關聯。

這應該爲你工作:

filter :surveys_updated_at, label: 'By Date Completed', as: :date_range 

你做的是不是,如何ransacker應該工作。我知道這是一個常見的谷歌結果,但它是錯誤的。

  1. 攻擊者在ActiveAdmin中沒有同時收到兩個日期。歹徒將撥打by_date_completed_gteqby_date_completed_lteq

  2. 一個ransacker格式化程序只是格式化輸入值。例如,將一個字符串轉換爲一個Int。

  3. racksacker的block/the callable proc需要返回放置在DB查詢中的Arel/SQL字符串。

一個抽象ransacker例如:

ransacker :foo do 
    "ransacker sql code" 
end 

"SELECT * FROM bar WHERE 'ransacker sql code' = <input>" 

你洗劫應該是這樣的:

"SELECT * FROM users WHERE surveys.updated_at >= START_DATE AND surveys.updated_at <= END_DATE" 
+0

感謝蒂莫:

ransacker :by_date_completed do "surveys.updated_at" end 

這應該像一個查詢結束!說得通。 – 2015-08-19 04:38:31