通常在选择日期范围时,您希望日期包含在内。即“11/07/2011”-“11/09/2011”,您希望它从 11 月 7 日、8 日和 9 日返回结果。ActiveAdmin 过滤器现在的工作方式看起来该日期范围只会返回 8 日的结果,这是违反直觉的。
为了将此行为更改为预期的行为,我需要修改什么?
通常在选择日期范围时,您希望日期包含在内。即“11/07/2011”-“11/09/2011”,您希望它从 11 月 7 日、8 日和 9 日返回结果。ActiveAdmin 过滤器现在的工作方式看起来该日期范围只会返回 8 日的结果,这是违反直觉的。
为了将此行为更改为预期的行为,我需要修改什么?
虽然 Raels 的主要思想是正确的,但解决方案太老套了。您不应该修补客户端。我们所要做的就是*_lte
使用 为日期时间列的输入添加时间扩展before_filter
。我们可以很容易地实现那个monkeypatching的filter
方法ActiveAdmin::ResourceDSL
。
这是解决此问题的通用解决方案:https ://gist.github.com/4015836 。
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,这将包括(几乎)一整天。
希望有帮助!