0

属性 comment (タイプtext )を持つモデル承認があります。

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

4

1 に答える 1

1

うーん...それは奇妙です、私がやろうとすると私のレールアプリから同様の動作が見られます:

@s.name << "test"

そしてリロード...元の名前がリセットされています!

ただし、 @s.name += "test" を実行すると

再ロードした後でも、新しい名前が保存されます。

<< がそのように振る舞う理由はわかりませんが、通常はすべての場合に += をデフォルトにしているので、これまでに気づいたことはありません。+= に変更すると役に立ちますか?

編集: API を見ると、<< が元の文字列を変更するのに対し、+ または += は古い文字列を含む新しい文字列を作成するためでしょうか? たぶん、Rails はどうにかして (変更ではなく) 新しいものとしてマークしたものだけを保存します。

于 2010-06-25T15:23:32.467 に答える