这个问题在这里已有答案:
我将一些文本附加到我的一个notes
模型上的ActiveRecord::Base
字段中,但是当我保存它时,它没有得到更新:
valve.notes
#=> "Level: Top"
valve.notes << "\nDirection: North"
valve.notes
#=> "Level: Top\nDirection: North"
valve.save
#=> true
valve.reload.notes
#=> "Level: Top"
想出来,想在将来分享给其他人(很可能是我自己!)。
我不知道这一点,但是当你用concat()
或<<
连接它时,ActiveRecord无法确定某个属性是否已被更改(即很脏)。并且因为ActiveRecord仅保存或更新已更改的属性(即脏的),所以它不会更新该属性。
如果你还没有意识到它,这是一个鬼鬼祟祟的小问题,因为它不仅无声地失败,它根本不认为它是失败的(如果你问ActiveRecord的作者,它可能没有)。
valve.notes
#=> "Level: Top"
valve.notes << "\nDirection: North"
valve.changed?
#=> false
valve.notes_changed?
#=> false
valve.save
#=> true
valve.reload.notes
#=> "Level: Top"
你可以在Rails' API Docs上阅读更多相关信息。
要解决这个问题,您需要做以下两件事之一:
notes
属性已经改变(即它现在变脏了):
valve.notes << "\nDirection: North"
valve.changed?
#=> false
valve.notes_will_change!
valve.changed?
#=> true
concat()
或<<
附加到您的属性:
valve.notes = "#{valve.notes}\nDirection: North"
valve.changed?
#=> true
希望至少能帮助另一个灵魂。
J.P