2011年9月16日 星期五

Ruby on Rails 搜尋資料建立的日期範圍

在 RoR 建立 Model 的時候,它會自動幫 table 補上三個欄位:id, created_at, updated_at。可以利用

 

created_at, updated_at classActiveSupport::TimeWithZone,要特別注意的是每種時間 class 基準上的不同。

 

我們如果在頁面上這樣設計與搜尋:

image

 

而我們希望利用 created_at 搜尋到 「2011-9-16 00:00:00」 ~ 「2011-9-16 23:59:59」(不包含 2011-9-17 00:00:00) 的資料,那麼 controller 這邊應該要這樣處理。

程式碼

 
@start_date_year = params[:search][:start_date_year]
@start_date_month = params[:search][:start_date_month]
@start_date_day = params[:search][:start_date_day]
@end_date_year = params[:search][:end_date_year]
@end_date_month = params[:search][:end_date_month]
@end_date_day = params[:search][:end_date_day]
 
Model.where(
    :created_at =>
        ("#{@start_date_year}-#{@start_date_month}-#{@start_date_day}".to_date.to_time)..
        (("#{@end_date_year}-#{@end_date_month}-#{@end_date_day}".to_date + 1).to_time - 1
)

 

主要是利用 to_date 將字串轉換為 class Date 方便 +1 day,再利用 to_time 轉換為 class Time 方便 –1 second,此時 class Timeclass ActiveSupport::TimeWithZone 是同一個時間基準(Date 快了 8 hours ,時區的關係),便可直接比對。

沒有留言:

張貼留言