2010-08-19 57 views
1

我想修改updated_at屬性,以便每次更新記錄時只顯示日期和小時,而小時和分鐘爲零。 而不是2010-08-13 11:04:12,會有2010-08-13 11:00:00。 Rails 2.3中最合理的方法是什麼?覆蓋Rails updated_at屬性

更新

爲什麼我想要做什麼,我都問是因爲我想數據,按日期省略小時,秒排序的原因。

謝謝!

回答

4

不要嘗試更改存儲在數據庫中的值;改變你如何輸出它:

timestamp = @model.updated_at # where @model is your model object 

# output it in a format that overrides the values for minute and second 
puts timestamp.strftime "%Y-%m-%d %H:00:00" 

見你可以使用其他格式說明的strftime紅寶石文檔。


根據您的更新,我仍然不會改變updated_at存儲,而是格式化您的查詢的ORDER BY內的日期。例如,你可以

ORDER BY DATE(updated_at), HOUR(updated_at), ... 

我做了一個在我的應用程序,其中有約22,000記錄的活動表非常快速的性能測試。 ORDER BY updated_at花費在2.94和3.19s之間完成,平均時間爲3.00s。 ORDER BY DATE(updated_at), HOUR(updated_at)完成時間在2.93到3.06s之間,平均時間爲2.99s。這裏的分析數據:

+----------+------------+-----------------------------------------------------------------+ 
| Query_ID | Duration | Query               | 
+----------+------------+-----------------------------------------------------------------+ 
|  1 | 2.94530500 | SELECT * FROM posts ORDER BY updated_at       | 
|  2 | 2.94583800 | SELECT * FROM posts ORDER BY updated_at       | 
|  3 | 3.18711700 | SELECT * FROM posts ORDER BY updated_at       | 
|  4 | 2.96923700 | SELECT * FROM posts ORDER BY updated_at       | 
|  5 | 2.97255400 | SELECT * FROM posts ORDER BY updated_at       | 
|  6 | 3.06706800 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  7 | 3.00414400 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  8 | 2.95551500 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  9 | 3.02181900 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  10 | 2.93130000 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
+----------+------------+-----------------------------------------------------------------+ 
+0

我沒有提到它,但我爲什麼想要做什麼我問的原因是因爲我想對數據進行排序,按日期排除小時和秒。當然,我可以在我的選擇中格式化日期,但我認爲這不是一個好的表現決定。 – spacemonkey 2010-08-19 21:24:34

+0

但在查詢數據時使用sql函數時性能如何?因爲這些數據會被頻繁查詢,而且更新頻率很低 – spacemonkey 2010-08-19 21:44:45

+0

您必須經過一段時間才能更改'updated_at'的存儲方式,因爲即使您嘗試手動設置,Rails也會自動將值設置爲保存記錄時所需的值。 – 2010-08-19 21:48:14

1

這是一個時間戳記對象,所以您最好使用輔助函數截斷最小/秒信息。

1

whatever.created_at.strftime("%Y-%m-%d %H:00:00")

0

這是不是你應該用積極的記錄做。這是一個視圖幫手可以完成的事情,你不需要改變事情得到保存的方式,這可能會在未來更多的工作。

想想strftime以及如何改變它。

在幫助文件:

def format_date_for_rounded_hour(date) 
    date.striftime("%Y-%m-%d %H:00") 
end 
1

我建議丹尼爾的解決方案。但是,如果您想要使用修改後的「updated_at」字段保存該記錄,則需要爲給定模型重新實施導軌的自動時間戳,然後012選擇100%正面

所以,在你的模型,你可以做到以下幾點:

self.record_timestamps = false # disables rails' auto-timestamping 
before_create :set_created_at 
before_save :set_updated_at 

def set_created_at 
    self.created_at = Time.now 
end 
def set_updated_at 
    self.updated_at = Time.now.change({:min => 0, :sec => 0}) # clears minutes and seconds 
end