Я столкнулся с подобной проблемой в 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, и у меня не было времени, чтобы разобраться в этом достаточно, чтобы понять, почему.Если кому-то захочется расширить / улучшить это решение или предложить лучшее решение, я весь в ушах.