ある日、Activerecordでデータの書き換えをやっているときにハマったのでメモ。
モデル
class Book < ActiveRecord::Base end
値の書き換え
book = Book.find(1) book.name #=> はじめてのPython book.name.gsub! /python/i, 'ruby’ book.name #=> はじめてのruby book.save book.name #=> はじめてのruby #書き換わった・・・・よね?
として保存した。
ところが期待を裏切られた。
別ターミナルからデータを取り出してみると・・・
book = Book.find(1) book.name #=> はじめてのPython !!変わってない!!
となる。書き換えできてない。
gsub!としたつもりが !つけ忘れたのかのなぁっておもったけどやっぱり違うみたい
キャッシュした文字列を書き換えているだけで、内部的に書き換えフラグた立たないようでした。
book.name =book.name.gsub /python/i, ‘ruby’ #明示的に代入
としないとダメのようだ。 どうやら書き換えは colname= でメソッド定義されているらしい。
最新版のActiveRecordでは改善されているのだろうか。今使っているactiverecord (3.0.9)での再現例でした。