それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

RailsのActiveRecordのカラム値の書き換えの注意点

ある日、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)での再現例でした。