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 上阅读更多相关信息。

解决方案

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

  1. 让 ActiveRecord 知道 notes 属性已经改变(即现在是 dirty):

    valve.notes << "\nDirection: North"
    
    valve.changed?                      
    #=> false
    
    valve.notes_will_change!
    
    valve.changed?                      
    #=> true
    
  2. 不要使用 concat()<< 附加到您的属性:

    valve.notes = "#{valve.notes}\nDirection: North"
    
    valve.changed?                      
    #=> true
    

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

日本