2010-11-09 18 views
5

今天我們遇到了一個有趣的問題。看起來,如果您使用shovel運算符連接ActiveRecord模型中的字符串屬性,它不會使模型變髒。例如:Ruby on Rails:使用鏟子操作員更新模型上的字符串屬性不會使模型變髒

e = Employee.first 
e.name << "asdf" 
e.name_changed? # returns false 
e.changed? # returns false 

這是有道理的,因爲鏟運營商更新字符串未做它的一個副本,其中+ =運算符將字符串的副本。我沒有看到ActiveRecord如何使用鏟運算符可能知道某些更改。

有沒有其他人看到過這個?連接字符串時,解決方案是使用+=而不是<<

+0

如果您還沒有提交錯誤報告,請向rails專員提交。 – rwilliams 2010-11-09 20:29:17

+0

不,它不是一個bug,它已經知道了,它不可能避免 – shingara 2010-11-10 09:48:29

回答

5

解決方案是你寫的。

,或者您attibute will_change

e = Employee.first 
e.name_will_change! 
e.name << "asdf" 
e.name_changed? # => true 

它的API文檔上的標記,你可以標記之前。 ActiveModel :: Dirty

+2

上帝,我只是喜歡Ruby代碼有時看起來像我們和計算機之間的真實而簡潔的對話!我們是發佈命令的老闆,而不是填寫數十份報告(XML?)的奴隸,老闆永遠不會讀。 – 2010-11-09 20:23:00

相關問題