繁体   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