Rails - исключить атрибут из сохраненного - PullRequest
3 голосов
/ 11 июня 2011

У меня есть столбец с именем updated_at в postgres. Я пытаюсь, чтобы БД установил время по умолчанию. Но Rails все еще выполняет запрос updated_at = NULL. Но postgres будет устанавливать временную метку только по умолчанию, когда updated_at вообще отсутствует в запросе.

Как мне Rails исключить столбец?

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Я столкнулся с подобной проблемой в Rails 2.2.2.Начиная с этой версии в ActiveRecord есть метод attr_readonly, но create его не уважает, только обновляет.Я не знаю, было ли это изменено в последней версии.Я переопределил метод create, чтобы заставить это уважать этот параметр.

def create
    if self.id.nil? && connection.prefetch_primary_key?(self.class.table_name)
      self.id = connection.next_sequence_value(self.class.sequence_name)
    end

    quoted_attributes = attributes_with_quotes(true, false)

    statement = if quoted_attributes.empty?
      connection.empty_insert_statement(self.class.table_name)
    else
      "INSERT INTO #{self.class.quoted_table_name} " +
      "(#{quoted_attributes.keys.join(', ')}) " +
      "VALUES(#{quoted_attributes.values.join(', ')})"
    end

    self.id = connection.insert(statement, "#{self.class.name} Create",
      self.class.primary_key, self.id, self.class.sequence_name)

    @new_record = false
    id
end

Изменение состоит в том, чтобы просто передать false в качестве второго параметра attribute_with_quotes и использовать quoted_attributes.keys для имен столбцов при построении SQL.Это сработало для меня.Недостатком является то, что, переопределив это, вы потеряете обратные вызовы before_create и after_create, и у меня не было времени, чтобы разобраться в этом достаточно, чтобы понять, почему.Если кому-то захочется расширить / улучшить это решение или предложить лучшее решение, я весь в ушах.

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

Вы можете отключить это поведение, установив для переменной ActiveRecord :: Base class variable__stastamps значение false.

В config / environment.rb блок Rails :: Initializer.run:

config.active_record.record_timestamps = false

(если это не работает, попробуйте вместо этого ActiveRecord :: Base.record_timestamps = false в конце файла)

Если вы хотите установить только для данной модели:

class Foo < ActiveRecord::Base
  self.record_timestamps = false
end

Кредит Жан-Франсуа на http://www.ruby -forum.com / topic / 72569

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