2014-09-30 3 views
4

Мне нужно создать собственный фильтр ActiveAdmin для диапазона дат, который принадлежит другому ресурсу. Я хочу отфильтровать список пользователей по диапазону дат, когда они завершили опрос.Пользовательский фильтр 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 передает диапазон дат в фильтре по одному за раз, и поэтому я не могу получить диапазон поиска по?

Что я должен делать в этом сценарии? Неужели я собираюсь решить всю проблему не так?

ответ

3

Я думаю, что для этого вам не нужен пользовательский ransacker. Вы можете фильтровать перекрестные ассоциации.

Это должно работать для вас:

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

То, что вы делаете не так, как грабитель должен работать. Я знаю, что это общий результат Google, но это неправильно.

  1. Ransacker не получает обе даты сразу в ActiveAdmin. Обозреватель будет звонить с by_date_completed_gteq и by_date_completed_lteq.

  2. Форвардер ransacker предназначен только для форматирования входного значения. Преобразуйте String в Int, например.

  3. Блок/вызываемый процесс ransacker должен возвращать строку Arel/SQL, которая помещается в запрос БД.

абстрактный пример грабитель:

ransacker :foo do 
    "ransacker sql code" 
end 

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

Ваш Ransack должен выглядеть следующим образом:

ransacker :by_date_completed do 
    "surveys.updated_at" 
end 

Это должно закончиться в запросе, как:

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

Спасибо Timo ! Имеет смысл. –

Смежные вопросы