[英]Make ActiveAdmin use inclusive date filter?
通常在選擇日期范圍時,您希望日期包含在內。 即“11/07/2011” - “11/09/2011”您希望它能夠從11月7日,8日和9日返回結果。 ActiveAdmin過濾器現在的工作方式看起來就像日期范圍只返回第8個結果,這是違反直覺的。
為了將此行為更改為預期,我需要修改什么?
雖然雷爾斯的主要想法是正確的,但解決方案太過於苛刻。 你不應該修補客戶端。 我們所要做的就是使用before_filter
為datetime列的*_lte
輸入添加時間擴展。 我們可以很容易地實現對ActiveAdmin::ResourceDSL
的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'創建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,其中將包括(幾乎)整天。
希望有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.