Не пытайтесь изменить значение, хранящееся в базе данных; изменить способ вывода:
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
ruby для других спецификаторов формата, которые вы можете использовать.
Исходя из вашего обновления, я бы все равно не изменил способ хранения updated_at
, а вместо этого отформатировал бы дату в ORDER BY
вашего запроса. Например, вы могли бы
ORDER BY DATE(updated_at), HOUR(updated_at), ...
Я выполнил очень быстрый тест профилирования для живой таблицы в моем приложении, в котором содержится около 22 000 записей. ORDER BY updated_at
потребовалось от 2,94 до 3,19 с, со средним временем 3,00 с. ORDER BY DATE(updated_at), HOUR(updated_at)
потребовалось от 2,93 до 3,06 с, со средним временем 2,99 с. Вот данные профилирования:
+----------+------------+-----------------------------------------------------------------+
| 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) |
+----------+------------+-----------------------------------------------------------------+