Rails 未保存已更改的属性
Rails is not saving an attribute that is changed
我正在将一些文本附加到我的 ActiveRecord::Base
模型之一的 notes
字段,但是当我保存它时,它没有得到更新:
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 无法确定当您使用 concat()
或 <<
。并且因为 ActiveRecord 只保存或更新已更改的属性(即 dirty),它不会更新该属性。
如果您还没有意识到这是一个偷偷摸摸的小问题,因为它不仅默默地失败,而且根本不认为自己失败了(如果您问 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
属性已经改变(即现在是 dirty):
valve.notes << "\nDirection: North"
valve.changed?
#=> false
valve.notes_will_change!
valve.changed?
#=> true
不要使用 concat()
或 <<
附加到您的属性:
valve.notes = "#{valve.notes}\nDirection: North"
valve.changed?
#=> true
希望至少能帮助到另一个灵魂。
日本
我正在将一些文本附加到我的 ActiveRecord::Base
模型之一的 notes
字段,但是当我保存它时,它没有得到更新:
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 无法确定当您使用 concat()
或 <<
。并且因为 ActiveRecord 只保存或更新已更改的属性(即 dirty),它不会更新该属性。
如果您还没有意识到这是一个偷偷摸摸的小问题,因为它不仅默默地失败,而且根本不认为自己失败了(如果您问 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
属性已经改变(即现在是 dirty):valve.notes << "\nDirection: North" valve.changed? #=> false valve.notes_will_change! valve.changed? #=> true
不要使用
concat()
或<<
附加到您的属性:valve.notes = "#{valve.notes}\nDirection: North" valve.changed? #=> true
希望至少能帮助到另一个灵魂。
日本