2

我在我的一个模型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"
4

1 回答 1

11

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

解决方案

要解决此问题,您需要执行以下两项操作之一:

  1. 让 ActiveRecord 知道该notes属性已更改(即它现在是的):

    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
    

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

J.P

于 2015-04-30T03:30:08.500 回答