Ruby on Rails: виртуальный метод, который модифицирует атрибуты модели с помощью << не смогли сохранить этот атрибут
-
30-09-2019 - |
Вопрос
Существует о ратификации модели с комментарием атрибута (типа текст)
def Ratification < ActiveRecord::Base
attr_accessor :add_comment
def add_comment=(text)
self.comment ||= ""
self.comment << "\r\n" + text
end
end
И если я использую add_comment =. Это нормально, прежде чем я сохраню объект. После сохранения комментариев изменения было удалено.
>> r = Ratification.last
Ratification Load (0.6ms) SELECT * FROM `ratifications` ORDER BY ratifications.id DESC LIMIT 1
=> #<Ratification id: 8, user_id: 686, comment: "dasads", created_at: "2010-06-25 13:16:24", updated_at: "2010-06-25 13:38:36">
>> r.comment
=> "dasads"
>> r.add_comment="text"
=> "text"
>> r.comment
=> "dasads\r\ntext"
>> r.save
SQL (0.7ms) BEGIN
SQL (0.2ms) COMMIT
=> true
>> r.reload
Ratification Load (1.6ms) SELECT * FROM `ratifications` WHERE (`ratifications`.`id` = 8)
=> #<Ratification id: 8, user_id: 686, comment: "dasads", created_at: "2010-06-25 13:16:24", updated_at: "2010-06-25 13:38:36">
>> r.comment
=> "dasads"
Почему?!
Rails 2.3.8 Ruby 1.8
Решение
HRRRM ... Это странно, я вижу подобное поведение из моего приложения Rails, когда я пытаюсь сделать:
@s.name << "test"
А потом перезагрузите ... исходное имя становится сбросом!
Однако, если я сделаю @ s.name + = "test"
Тогда даже после перезагрузки новое имя сохраняется.
Я не уверен, почему << ведет себя так, но я обычно по умолчанию + = во всех случаях, поэтому я никогда раньше не заметил. Меняется на + = поможет вам?
Редактировать: Глядя на API, может быть, это потому, что << модифицирует исходную строку, тогда как + или + = делает новую строку, которая содержит старый? Возможно, рельсы как-то только экономит вещи, которые оно помечено как новое (а не изменено?)