2015-06-23 102 views
1

我正在創建一個過濾部分視圖,其中用戶可以使用日曆選擇from -date和to -date。這些日期在模型範圍內用於在數據庫查詢中執行SQL Where子句。如果用戶未選擇其中一個日期,則應分配默認值:from的最小可用日期和to的最大可用日期。最小和最大可能日期

unless params[:from].blank? and params[:to].blank? 
    from = begin Date.parse(params[:from]) rescue ??? end 
    to = begin Date.parse(params[:to]) rescue ??? end 
    @model_instances = @model_instances.start_end from, to 
end 

(...)

scope :start_end, -> (start_date, end_date) { where('(:start_date <= "from" AND "from" <= :end_date) OR' + 
               '(:start_date <= "to" AND "to" <= :end_date) OR' + 
               '("from" <= :start_date AND :end_date <= "to")', 
               {start_date: start_date, end_date: end_date}) } 

fromto模型日期屬性也是相關表的數據庫字段。

在Rails,Date類有一個家庭的方法beginning_of(日,周,月等),但目前還沒有方法,beginning_of_timeend_of_timeDate.minDate.max

是否有任何方法來獲取最小和最大日期?

+0

日期範圍,你可以直接跳過這個過程中,如果沒有'PARAMS [:從]'或'PARAMS [:至] '給出,所以任何日期都會匹配查詢 – MrYoshiji

+0

@MrYoshiji我添加了模型範圍代碼。我需要我的SQL查詢工作,即使只有一個日期是由用戶選擇。 – sgnsajgon

+1

如果只提供兩個日期中的一個,並且如果提供了兩個'start_end'作用域,則可以將'start_end'作用域分割爲兩個不同的作用域'start_before'和'end_before'。我認爲這是最好的方法,因爲在這種情況下,你不會「猜測最終用戶未提供的日期」 – MrYoshiji

回答

2

如果沒有params爲給讀者完全可以跳過條件對startend日期:

if params[:from].present? and params[:to].present? 
    @model_instances.start_end(params[:from], params[:to]) 
end 

,然後你會得到不依賴於日期的結果,因爲沒有from和/或end日期已經排滿。

0

您可以將日期的範圍與模型的值進行比較,並在參數未通過時設置默認值。

#setup default if desired, or you can skip if params are blank 
from = params[:from] || default_from 
to = params[:to] || default_to 
@model_instances.start_end(from, to) 

和你的範圍會是這個樣子,如果你使用的ActiveRecord的

scope :start_end, ->(start_date, end_date){where(from: start_date..end_date, to:start_date..end_date)}