【问题标题】:Custom ActiveAdmin filter for Date Range日期范围的自定义 ActiveAdmin 过滤器
【发布时间】:2014-09-30 08:26:57
【问题描述】:

我需要为属于另一个资源的日期范围创建自定义 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 一次将日期范围传递给过滤器,所以我无法获得搜索范围?

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

【问题讨论】:

    标签: ruby-on-rails filter activeadmin ransack


    【解决方案1】:

    我认为您不需要为此定制勒索程序。您可以过滤交叉关联。

    这应该适合你:

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

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

    1. ransacker 不会在 ActiveAdmin 中同时收到两个日期。 ransacker 将调用by_date_completed_gteqby_date_completed_lteq

    2. ransacker 格式化程序仅用于格式化输入值。例如,将 String 转换为 Int。

    3. ransacker 的 block/callable proc 需要返回一个 Arel/SQL 字符串,该字符串放置在 DB 查询中。

    一个抽象的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"
    

    【讨论】:

    • 谢谢蒂莫!有道理。
    • 我最终不得不使用 ransacker(:name, type: :date) { Arel.sql('date(timestamp_column)') } 来让 as: :date_range 使用时间戳列。
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多