2011-12-05 23 views
3

通常在選擇日期範圍時,預計日期爲 (含)。即「2011年11月7日」 - 「11/09/2011」,您預計它會在11月7日,8日和9日返回 結果。 ActiveAdmin過濾器正在工作的方式現在看起來像日期範圍只會返回 第8個結果,這是違反直覺的。使ActiveAdmin使用包含日期過濾器?

爲了將此行爲更改爲預期的行爲,我需要修改什麼?

回答

1

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,這將包括(幾乎)整個一天。

希望有幫助!

6

儘管雷爾斯的主要觀點是正確的,但解決方案太過於粗魯。你不應該修補客戶端。我們所要做的就是使用before_filter爲日期時間列的*_lte輸入添加時間延長。我們可以很容易地實現方法ActiveAdmin::ResourceDSL的monkeypatching。

以下是解決此問題的通用解決方案:https://gist.github.com/4015836