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