【问题标题】:Make ActiveAdmin use inclusive date filter?让 ActiveAdmin 使用包含日期过滤器?
【发布时间】:2012-01-13 00:56:43
【问题描述】:

通常在选择日期范围时,您希望日期为 包括的。即“11/07/2011”-“11/09/2011”您希望它返回 11 月 7 日、8 日和 9 日的结果。 ActiveAdmin 过滤器的工作方式 现在看起来该日期范围只会返回结果 第 8 个是违反直觉的。

我必须修改什么才能将此行为更改为预期的?

【问题讨论】:

    标签: ruby-on-rails filter activeadmin meta-search


    【解决方案1】:

    AA 中的代码使用 gte 和 lte,因此它试图具有包容性。我发现问题在于使用日期时间而不是日期。问题是代码只指定了日期部分,当扩展到日期时间时,会在午夜 (00:00:00.000000) 产生相同的日期。这发生在 gte(它是无害的)和 lte(它是致命的)部分。比较 lte 的部分需要与 23:59:59.999999 的时间部分进行比较。

    所以,这就是我所做的似乎有效的方法。

    在相对路径“app/assets/javascript/make_datetime_lte_work.js.coffee”创建一个coffeescript文件,内容如下:

        $(document).ready ->
          $('input.datepickerlte').datepicker 'option', {dateFormat: 'yy-mm-dd     23:59:59.99999'}
    

    接下来,我们将对日期范围过滤器代码进行猴子修补。将以下内容放入相对路径 'config/initializers/make_datetime_lte_work.rb' 的 ruby​​ 文件中:

    module ActiveAdmin
      module Inputs
        class FilterDateRangeInput
    
          def to_html
            input_wrapping do
              [ label_html,
                builder.text_field(gt_input_name, input_html_options(gt_input_name)),
                template.content_tag(:span, "-", :class => "seperator"),
                builder.text_field(lt_input_name, input_html_options(lt_input_name, ' datepickerlte')),
              ].join("\n").html_safe
            end
          end
    
          def input_html_options(input_name = gt_input_name, extra_class = '')
            current_value = @object.send(input_name)
            { :size => 12,
              :class => "datepicker" + extra_class,
              :max => 10,
              :value => current_value.respond_to?(:strftime) ? current_value.strftime("%Y-%m-%d") : "" }
          end
        end
      end
    end
    

    现在,请确保编辑您的 app/assets/javascript/active_admin.js 以通过在评论中添加对新 javascript 文件的引用来引用它。这是我的样子:

    //= require active_admin/base
    //= require make_datetime_lte_work
    

    重新启动您的 Rails 应用程序,以便调用初始化程序。

    现在,过滤器中日期范围的结束部分将在日期后附加 23:59:59.999999,这将包括(几乎)一整天。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      虽然 Raels 的主要思想是正确的,但解决方案太老套了。您不应该修补客户端。我们所要做的就是使用before_filter 为日期时间列的*_lte 输入添加时间扩展。通过ActiveAdmin::ResourceDSLfilter 方法,我们可以轻松实现monkeypatching。

      这是解决此问题的通用解决方案:https://gist.github.com/4015836

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 2019-03-05
        • 2020-05-23
        • 1970-01-01
        相关资源
        最近更新 更多