通常在选择日期范围时,您希望日期为 包括的。即“11/07/2011” - “11/09/2011”,您希望它能够归还 结果来自11月7日,8日和9日。 ActiveAdmin过滤器的工作方式 现在看来,日期范围只会返回结果 第8个是反直觉的。
为了将此行为更改为预期,我需要修改哪些内容?
答案 0 :(得分:6)
虽然雷尔斯的主要想法是正确的,但解决方案太过于苛刻。你不应该修补客户端。我们所要做的就是使用*_lte
为datetime列的before_filter
输入添加时间扩展。我们可以轻松实现filter
ActiveAdmin::ResourceDSL
方法的monkeypatching。
以下是解决此问题的通用解决方案:https://gist.github.com/4015836。
答案 1 :(得分: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,其中包括(几乎)整天。
希望有所帮助!