Rails不保存已更改的属性

时间:2015-04-30 03:30:09

标签: ruby-on-rails ruby activerecord attributes dirty-data

我将一些文字附加到我的 if myString.count(conv for conv in namingConventionList): myString= myString.replace(conv, userInput)) elif userInput.startswith('_'): myString= '%s%s' % (name, userInput) elif userInputConvention.endswith('_'): myString= '%s%s' % (userInput, name) else: myString= '%s_%s' % (name, userInput) 模型之一的notes字段中,但是当我保存它时,它不会更新:

ActiveRecord::Base

1 个答案:

答案 0 :(得分:9)

Concat没有告诉ActiveRecord属性发生了变化。

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

我不知道这一点,但ActiveRecord无法确定属性是否已更改(即 dirty ),当您将其连接到concat()或{{1}时}。并且由于ActiveRecord仅保存或更新已更改的属性(即 dirty ),因此它不会更新该属性。

如果你还没有意识到这一点,这是一个偷偷摸摸的小问题,因为它不仅无声地失败,它根本不认为它失败了(也许它没有#&# 39;如果你问ActiveRecord的作者:)。

<<

您可以在Rails' API Docs上了解详情。

解决方案

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

  1. 让ActiveRecord知道valve.notes #=> "Level: Top" valve.notes << "\nDirection: North" valve.changed? #=> false valve.notes_changed? #=> false valve.save #=> true valve.reload.notes #=> "Level: Top" 属性已更改(即现在):

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

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

    JP

相关问题