Но в моделях когда пишу Time.now, он сохраняет не текущую дату (часы), а раннюю на 3 часа.
Вместо Time.now правильнее использовать Time.zone.now (или Time.current, что примерно одно и то же). В базе данных всё равно всё будет храниться в UTC, но это влияет на взаимодействие с клиентом. В вашем случае разницы не будет, но это потому что серверное и клиентское время у вас одинаковое.
И еще, вместо того, чтобы написать Moscow, нельзя сделать другое, чтобы по текущему часовому поясу определила система?
config.time_zone - это не серверное время (оно как раз читается из системы), это предполагаемый часовой пояс клиента. То есть когда время приходит от клиента/отображается клиенту, оно конвертируется из/в этот пояс.
В общем:
- Time.now - системное время, в часовом поясе который прописан в системе на сервере
- Time.zone.now - время клиента, определяется через config.time_zone, либо на ходу через Time.zone =
- База данных - всё хранится в UTC + 0