Activerecord: преобразование строк во времена по местному времени - PullRequest
1 голос
/ 05 июня 2011

Я прочитал довольно много статей, сделал свою домашнюю работу.У меня все время хранится как UTC, каждый пользователь устанавливает свой часовой пояс и т. Д. Вот проблема, с которой я столкнулся:

Time.zone
=> GMT-05:00 Eastern Time US  Canada

t = Ticket.first
t.hold_until = "Jan 1, 2012 9:00PM"
t.save!

t.hold_until
=> Sun, 01 Jan 2012 16:00:00 EST -05:00

# notice the above time lost 5 hours

Проблема в том, что строка взята из запроса POST, предоставленного пользователем,Разве не имеет смысла предполагать, что пользовательский ввод осуществляется по местному времени, а не по UTC?Я что-то упустил или это не должно быть ActiveRecord по умолчанию?Какой правильный способ сделать это, кроме необходимости конвертировать время во всех моих контроллерах.Это кажется неправильным и не очень сухим.

1 Ответ

0 голосов
/ 05 июня 2011

Я выяснил проблему, и это связано с плохо написанным кодом в ActiveRecord (сюрприз!).В любом случае ActiveRecord :: Base.define_attribute_methods вызывается лениво через отсутствующий метод.Я определил этот метод так:

def hold_until=(value)
  # do some stuff here
  super
end

Итак, ActiveRecord пропустил этот метод, думая, что он определен.Это не должно иметь значения, но из-за плохого дизайна это имеет значение.AR имеет множество различных способов определения методов на основе их типа столбца.Вызов super side выполняет этот шаг и переходит к общему вызову write_attribute.Единственное решение - преобразовать время самостоятельно.Вы не можете вызвать define_attribute_methods, прежде чем включать модули из-за всей ерунды alias_method_chain.И вы не можете использовать код, который они уже написали, потому что он находится в блоке class_eval.Я бы порекомендовал datamapper, если это вообще возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...