[英]Custom ActiveAdmin Filter for Date Range - Complex Logic in Method
[英]Custom ActiveAdmin filter for Date Range
我需要為屬於另一個資源的日期范圍創建一個自定義ActiveAdmin篩選器。 我想按用戶完成調查的日期范圍過濾用戶列表。
我已經在ActiveAdmin DSL中聲明了一個自定義過濾器,如下所示:
filter :by_date_completed, label: 'By Date Completed', as: :date_range
這使我在活動管理員中擁有一個不錯的日期范圍來限制我的用戶。 都好。
我沒有找到很多有關如何執行此操作的文檔,但是在我的用戶模型中,我試圖創建一個用於處理過濾器的ransacker。
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一次將日期范圍傳遞給過濾器一個,因此我找不到搜索范圍嗎?
在這種情況下我打算做什么? 我會以錯誤的方式處理整個問題嗎?
我認為您不需要為此定制的搶劫犯。 您可以過濾交叉關聯。
這應該為您工作:
filter :surveys_updated_at, label: 'By Date Completed', as: :date_range
您沒有做的是,劫掠者應該如何工作。 我知道這是Google的常見結果,但這是錯誤的。
搶劫犯不會在ActiveAdmin中一次收到兩個日期。 by_date_completed_gteq
將通過by_date_completed_gteq
和by_date_completed_lteq
。
洗劫者格式化程序僅用於格式化輸入值。 例如,將字符串轉換為Int。
ransacker的塊/可調用proc需要返回放置在數據庫查詢中的Arel / SQL字符串。
一個抽象的ransacker示例:
ransacker :foo do
"ransacker sql code"
end
"SELECT * FROM bar WHERE 'ransacker sql code' = <input>"
您的行李箱應如下所示:
ransacker :by_date_completed do
"surveys.updated_at"
end
這應該以如下查詢結束:
"SELECT * FROM users WHERE surveys.updated_at >= START_DATE AND surveys.updated_at <= END_DATE"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.