Rails 3.2.9 では integer なカラムに紐付いた属性に Numeric・Boolean 以外の内容を入れたときの挙動が変わった

http://blog.eiel.info/blog/2012/11/16/rails-329-default-scope/ 読んで,「前からそうじゃなかったっけ?」と思ったので確認した.

そもそも default_scope の挙動が変わったのではなく,代入時のキャストの挙動が変わったようだ.(ここでは default_scope に配列を配置することの是非は置いておく)

rails g model item price:integer

という例では,以下のような状態になる

1.9.3-p286 :022 > Rails.version
 => "3.2.8"
1.9.3-p286 :023 > item.price = [100,200,300]
 => [100, 200, 300]
1.9.3-p286 :024 > item.price
 => 1
1.9.3-p286 :020 > Rails.version
 => "3.2.9"
1.9.3-p286 :021 > item.price = [100,200,300]
NoMethodError: undefined method `to_i' for [100, 200, 300]:Array

https://github.com/rails/rails/pull/7582 による修正で要するに「integer のカラムに配列とか数字じゃないもの入れたら普通は例外になる」という仕様.まあそりゃそうだよな.