Ruby on rails: виртуальный метод, который модифицирует атрибуты модели с помощью << не может сохранить этот атрибут - PullRequest
0 голосов
/ 25 июня 2010

Существует модель ратификации с комментарием атрибута (типа текст )

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"

Почему?!

Рельсы 2.3.8 Рубин 1.8

1 Ответ

1 голос
/ 25 июня 2010

Hrrrm ... это странно, я вижу подобное поведение в моем приложении rails, когда пытаюсь сделать:

@s.name << "test"

и затем перезагрузить ... исходное имя сбрасывается!

ОДНАКО, если я делаю @ s.name + = "test"

, то даже после перезагрузки новое имя сохраняется.

Я не уверен, почему <<ведет себя так, но я обычно по умолчанию + = во всех случаях, поэтому я никогда не замечал этого раньше.Поможет ли вам изменение на + =? </p>

Редактировать: Глядя на API, возможно, это потому, что << изменяет исходную строку, тогда как + или + = создает новую строку, которая содержит старую?Может быть, рельсы каким-то образом только сохраняют вещи, которые были помечены как новые (а не модифицированные?) </p>

...