![](/img/trans.png)
[英]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.