簡體   English   中英

日期范圍的自定義ActiveAdmin篩選器

[英]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的常見結果,但這是錯誤的。

  1. 搶劫犯不會在ActiveAdmin中一次收到兩個日期。 by_date_completed_gteq將通過by_date_completed_gteqby_date_completed_lteq

  2. 洗劫者格式化程序僅用於格式化輸入值。 例如,將字符串轉換為Int。

  3. 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.

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