3

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

为了将此行为更改为预期的行为,我需要修改什么?

4

2 回答 2

6

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

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

于 2012-11-05T07:50:50.543 回答
1

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

所以,这就是我所做的似乎有效的事情。

在相对路径 'app/assets/javascript/make_datetime_lte_work.js.coffee' 中创建一个包含以下内容的咖啡脚本文件:

    $(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,这将包括(几乎)一整天。

希望有帮助!

于 2012-06-06T03:54:57.340 回答