В модели Rails 3 атрибуты DateTime ложно «грязные» - PullRequest
6 голосов
/ 01 мая 2011

В моем приложении на Rails 3 я хочу записать запись в определенный журнал, только если на самом деле были внесены изменения в модель.Поэтому, если пользователь не изменяет ни одно из полей и нажимает кнопку «Отправить», в журнале не должно быть записи.

Но кажется, что несмотря ни на что, Rails всегда думает, что атрибуты DateTimeмодели были изменены.

Когда я отлаживаю, я запускаю следующие строки во время моего обновления, и они оба возвращают true, что, я думаю, было бы противоречием.

@request.begin_date == @request.begin_date_was  # Returns true
@request.begin_date_changed?  # Returns true

IМне интересно, связано ли это с изменением формата даты по умолчанию в инициализаторе (на «% m /% d /% Y») или, возможно, с часовыми поясами.

Я в тупике, так чтолюбая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

Вы можете изменить формат даты и времени по умолчанию в файле локали en.yml, например: (это пример французского формата в одном из моих проектов)

date:
 formats:
  default: "%d/%m/%Y"
  short: "%e %b"
  long: "%e %B %Y"
  long_ordinal: "%e %B %Y"
  only_day: "%e"
time:
 formats:
  default: "%d %B %Y %H:%M"
  time: "%H:%M"
  short: "%d %b %H:%M"
  long: "%A %d %B %Y %H:%M:%S %Z"
  long_ordinal: "%A %d %B %Y %H:%M:%S %Z"
  only_second: "%S"
 am: 'am'
 pm: 'pm'

Или вы можете просто преобразовать ваши экземпляры datetime в:@ request.begin_date.strftime ("% m /% d /% Y") == @ request.begin_date_was.strftime ("% m /% d /% Y") или даже:l (@ request.begin_date,: format => your_format_in_locale_file) == l (@ request.begin_date_was,: format => your_format_in_locale_file)

Надеюсь, это поможет вам

1 голос
/ 05 августа 2014

Я прибыл сюда из поиска Google для аналогичной проблемы. Это не было связано с версией Rails, но после некоторой отладки я обнаружил, что назначаю объект Time с миллисекундами. При вызове changed я получил обратно и массив на вид одинаковых объектов, поскольку он был преобразован в DateTime. Не уверен, может ли это быть ошибкой в ​​Rails или нет, но если вы столкнулись с той же проблемой, убедитесь, что вы не назначаете дату и время с миллисекундами в них.

1 голос
/ 17 июня 2012

Я понимаю, когда вы спросили, вы, вероятно, использовали другую версию Rails, но я сам наткнулся на это с Rails 3.2.5.Очевидно, это регрессия в 3.2.5 тоже: https://github.com/rails/rails/issues/6591

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