Rails没有保存更改的属性[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails没有保存更改的属性[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我将一些文本附加到我的一个notes模型上的ActiveRecord::Base字段中,但是当我保存它时,它没有得到更新:

valve.notes                          
#=> "Level: Top"

valve.notes << "
Direction: North"

valve.notes                          
#=> "Level: Top
Direction: North"

valve.save                           
#=> true

valve.reload.notes                   
#=> "Level: Top"
答案

Concat不会告诉ActiveRecord属性已更改。

想出来,想在将来分享给其他人(很可能是我自己!)。

我不知道这一点,但是当你用concat()<<连接它时,ActiveRecord无法确定某个属性是否已被更改(即很脏)。并且因为ActiveRecord仅保存或更新已更改的属性(即脏的),所以它不会更新该属性。

如果你还没有意识到它,这是一个鬼鬼祟祟的小问题,因为它不仅无声地失败,它根本不认为它是失败的(如果你问ActiveRecord的作者,它可能没有)。

valve.notes            
#=> "Level: Top"

valve.notes << "
Direction: North"

valve.changed?         
#=> false

valve.notes_changed?   
#=> false

valve.save
#=> true

valve.reload.notes
#=> "Level: Top"

你可以在Rails' API Docs上阅读更多相关信息。

Solution

要解决这个问题,您需要做以下两件事之一:

  1. 让ActiveRecord知道notes属性已经改变(即它现在变脏了): valve.notes << " Direction: North" valve.changed? #=> false valve.notes_will_change! valve.changed? #=> true
  2. 不要使用concat()<<附加到您的属性: valve.notes = "#{valve.notes} Direction: North" valve.changed? #=> true

希望至少能帮助另一个灵魂。

J.P

以上是关于Rails没有保存更改的属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Rails自动保存不保存对关联的更改

轻松保存重复多用的代码片段

Rails 6 + Webpack + jQuery 刷新时不保存更改

更改连接表中的属性值时,Rails 5 正在插入而不是更新

AlertDialog 更改片段中的背景颜色 [重复]

保存 Rails 模型的所有属性