我想修改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