Ruby on Rails:使用铲运算符更新模型上的字符串属性不会使模型变脏

Jon*_*ger 5 ruby ruby-on-rails

我们今天遇到了一个有趣的问题.似乎如果使用铲运算符在ActiveRecord模型上连接字符串属性,它不会使模型变脏.例如:

e = Employee.first
e.name << "asdf"
e.name_changed? # returns false
e.changed? # returns false
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为铲子操作员更新一个字符串而不复制它,其中+ =运算符将复制该字符串.我不知道如果你使用铲子操作员,ActiveRecord怎么可能知道有什么改变.

有没有人见过这个?解决方案只是使用+=而不是<<连接字符串时?

shi*_*ara 5

解决方法是你写的.

或者你可以在之前标记你的属性会改变

e = Employee.first
e.name_will_change!
e.name << "asdf"
e.name_changed? # => true
Run Code Online (Sandbox Code Playgroud)

它是API文档中的标记.::加载ActiveModel脏

  • 上帝,我只是喜欢Ruby代码有时看起来像我们和计算机之间真实但简洁的对话!而且我们是下达命令的老板,而不是那些填写了老板永远不会阅读的数十份报告(XML?)的奴隶. (2认同)