Concat 不会告诉 ActiveRecord 属性已更改。
想通了,想在这里分享给其他人(很可能是我自己!)。
我不知道这一点,但是当您使用或连接属性时,ActiveRecord 无法确定属性已被更改(即脏) 。而且因为 ActiveRecord 只保存或更新已更改(即脏)的属性,它不会更新该属性。concat()
<<
如果您还没有意识到它,这是一个偷偷摸摸的小问题,因为它不仅默默地失败了,而且它根本不认为它失败了(如果你问 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上阅读更多相关信息。
解决方案
要解决此问题,您需要执行以下两项操作之一:
让 ActiveRecord 知道该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