Ruby on Rails: updated_at - установить 0 при создании - PullRequest
2 голосов
/ 04 января 2011

Когда я создаю новую запись в таблице query, я хочу, чтобы updated_at (отметка времени) была '0000-00-00 00:00:00' - а не текущая отметка времени, как устанавливает Ruby on Rails по умолчанию.

Поле MySQL:

`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP

Однако Ruby on Rails генерирует этот SQL-запрос:

INSERT INTO `queries` (`updated_at`) VALUES ('2011-01-04 17:40:15')

Как мне это исправить?

Ответы [ 3 ]

8 голосов
/ 04 января 2011

Rails устанавливает updated_at на текущее время, потому что именно тогда последняя запись была обновлена. Это видит обновление как создание. Если вы хотите проверить, обновлялось ли что-нибудь, проверьте, совпадают ли его значения updated_at и created_at.

В противном случае вы сможете изменить введенное значение, принудительно вставив атрибут при вставке.

Post.new(@params.merge({:updated_at => DateTime::new})

или в методе before_create для вашей модели установите self.updated_at = DateTime::new.

1 голос
/ 04 января 2011

Если вы хотите, чтобы Rails пропустил запись меток времени, вы можете использовать этот API:

ActiveRecord::Base.record_timestamps = false
# This also works on individual models
Post.record_timestamps = false

Поскольку Rails (более подходящим образом ActiveRecord) не будет присваивать значение этому полю, ваша БД назначит для этих полей значение по умолчанию.

0 голосов
/ 05 августа 2013

Недавно я обнаружил этот пост в блоге на эту тему .

Подводя итог, он описывает (с примерами) методы переопределения поведения ActiveRecord по умолчанию с помощью этих столбцов отметок времени.Он объясняет, что ActiveRecord фактически игнорирует предоставленную информацию updated_at и всегда использует свои собственные метки времени.

В конечном счете, он обезьяна исправляет ActiveRecord, чтобы предоставить новый метод update_without_timestamping, который выполняет функцию отключения и повторного включения метки времени и это потокобезопасный и только изменяет поведение модели, над которой работает.

Если вы не хотите читать статью, его окончательный исправленный код обезьяны выглядит следующим образом:

module ActiveRecord
  class Base

    def update_record_without_timestamping
      class << self
        def record_timestamps; false; end
      end

      save!

      class << self
        remove_method :record_timestamps
      end
    end

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