通常在選擇日期範圍時,預計日期爲 (含)。即「2011年11月7日」 - 「11/09/2011」,您預計它會在11月7日,8日和9日返回 結果。 ActiveAdmin過濾器正在工作的方式現在看起來像日期範圍只會返回 第8個結果,這是違反直覺的。使ActiveAdmin使用包含日期過濾器?
爲了將此行爲更改爲預期的行爲,我需要修改什麼?
通常在選擇日期範圍時,預計日期爲 (含)。即「2011年11月7日」 - 「11/09/2011」,您預計它會在11月7日,8日和9日返回 結果。 ActiveAdmin過濾器正在工作的方式現在看起來像日期範圍只會返回 第8個結果,這是違反直覺的。使ActiveAdmin使用包含日期過濾器?
爲了將此行爲更改爲預期的行爲,我需要修改什麼?
AA中的代碼使用gte和lte,因此它試圖包容性。我發現問題是使用日期時間而不是日期。問題在於代碼僅指定日期部分,在擴展到日期時間時,在午夜(00:00:00.000000)產生相同的日期。這發生在gte(它是無害的)和lte(它是致命的)部分。比較lte的部分需要與23:59:59.999999的時間部分進行比較。
所以,這是我所做的似乎工作。
創建的相對路徑「應用程序/資產/ JavaScript的/ make_datetime_lte_work.js.coffee」具有下列內容的CoffeeScript文件:
$(document).ready ->
$('input.datepickerlte').datepicker 'option', {dateFormat: 'yy-mm-dd 23:59:59.99999'}
下一步,我們將猴子修補日期範圍過濾器代碼。把下面的內容轉換成在相對路徑「配置/初始化/ make_datetime_lte_work.rb」紅寶石文件:
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
現在,確保編輯您的應用程序/資產/ JavaScript的/ active_admin.js來引用您新的JavaScript文件通過在評論中添加對它的引用。這裏是我的樣子:
//= require active_admin/base
//= require make_datetime_lte_work
重新啓動您的rails應用程序,以便初始化程序被調用。
現在,過濾器中日期範圍的結尾部分將在日期後面附加23:59:59.999999,這將包括(幾乎)整個一天。
希望有幫助!
儘管雷爾斯的主要觀點是正確的,但解決方案太過於粗魯。你不應該修補客戶端。我們所要做的就是使用before_filter
爲日期時間列的*_lte
輸入添加時間延長。我們可以很容易地實現方法ActiveAdmin::ResourceDSL
的monkeypatching。
以下是解決此問題的通用解決方案:https://gist.github.com/4015836。