2010-08-19 55 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