我想修改updated_at屬性,以便每次更新記錄時只顯示日期和小時,而小時和分鐘爲零。 而不是2010-08-13 11:04:12,會有2010-08-13 11:00:00。 Rails 2.3中最合理的方法是什麼?覆蓋Rails updated_at屬性
更新
爲什麼我想要做什麼,我都問是因爲我想數據,按日期省略小時,秒排序的原因。
謝謝!
我想修改updated_at屬性,以便每次更新記錄時只顯示日期和小時,而小時和分鐘爲零。 而不是2010-08-13 11:04:12,會有2010-08-13 11:00:00。 Rails 2.3中最合理的方法是什麼?覆蓋Rails updated_at屬性
爲什麼我想要做什麼,我都問是因爲我想數據,按日期省略小時,秒排序的原因。
謝謝!
不要嘗試更改存儲在數據庫中的值;改變你如何輸出它:
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) |
+----------+------------+-----------------------------------------------------------------+
這是一個時間戳記對象,所以您最好使用輔助函數截斷最小/秒信息。
whatever.created_at.strftime("%Y-%m-%d %H:00:00")
這是不是你應該用積極的記錄做。這是一個視圖幫手可以完成的事情,你不需要改變事情得到保存的方式,這可能會在未來更多的工作。
想想strftime
以及如何改變它。
在幫助文件:
def format_date_for_rounded_hour(date)
date.striftime("%Y-%m-%d %H:00")
end
我建議丹尼爾的解決方案。但是,如果您想要使用修改後的「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
我沒有提到它,但我爲什麼想要做什麼我問的原因是因爲我想對數據進行排序,按日期排除小時和秒。當然,我可以在我的選擇中格式化日期,但我認爲這不是一個好的表現決定。 – spacemonkey 2010-08-19 21:24:34
但在查詢數據時使用sql函數時性能如何?因爲這些數據會被頻繁查詢,而且更新頻率很低 – spacemonkey 2010-08-19 21:44:45
您必須經過一段時間才能更改'updated_at'的存儲方式,因爲即使您嘗試手動設置,Rails也會自動將值設置爲保存記錄時所需的值。 – 2010-08-19 21:48:14