我需要为属于另一个资源的日期范围创建自定义ActiveAdmin过滤器。我想按照完成调查的日期范围过滤用户列表。
我已经在ActiveAdmin DSL中声明了一个自定义过滤器,如下所示:
filter :by_date_completed, label: 'By Date Completed', as: :date_range
这使我在活动管理员中成为一个很好的日期范围来限制我的用户。都好。
我还没有找到关于如何执行此操作的大量文档,但在我的用户模型中,我尝试创建一个搜索过滤器来处理过滤器。
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一次将日期范围传递给过滤器,因此我无法获取搜索范围?
在这种情况下,我打算做什么?我是以错误的方式解决整个问题吗?
答案 0 :(得分:5)
我认为你不需要定制洗劫者。您可以过滤交叉关联。
这应该适合你:
filter :surveys_updated_at, label: 'By Date Completed', as: :date_range
你做的不是,一个搜身者应该如何工作。我知道这是一个常见的谷歌搜索结果,但这是错误的。
搜索者不会在ActiveAdmin中同时收到这两个日期。搜索者将使用by_date_completed_gteq
和by_date_completed_lteq
进行通话。
ransacker格式化程序仅用于格式化输入值。例如,将String转换为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"