日期范围的自定义ActiveAdmin过滤器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日期范围的自定义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一次将日期范围传递给过滤器,所以我无法获得搜索范围?

在这种情况下我打算做什么?我是以错误的方式解决整个问题吗?

答案

我认为你不需要自定义搜索引擎。您可以过滤交叉关联。

这应该适合你:

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

你做的不是,一个洗劫者应该如何工作。我知道这是一个常见的谷歌结果,但这是错误的。

  1. 在ActiveAdmin中,搜索者不会立即收到这两个日期。洗劫者将用by_date_completed_gteqby_date_completed_lteq打电话。
  2. ransacker格式化程序仅用于格式化输入值。例如,将String转换为Int。
  3. ransacker的块/可调用proc需要返回放置在DB查询中的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"

以上是关于日期范围的自定义ActiveAdmin过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Einstein Analytics 中的自定义日期

Django 过滤 DateFilter 的自定义日期格式

按自定义日期范围输入过滤 wordpress 帖子

drupal 自定义视图过滤器

在 Django admin 中按自定义日期范围过滤

free-jqgrid中的日期“少但不空”自定义搜索