発生する問題
Rails3.2.8までは以下のようなコードが動いていました。
# Rails3.2.8
hoge = Hoge.find(1)
piyo.hoge_id = hoge
piyo.hoge_id # => 1
Rails3.2.9以降で同じコードを実行すると、NoMethodError
が発生します。
# Rails3.2.9
hoge = Hoge.find(1)
piyo.hoge_id = hoge
# NoMethodError: undefined method `to_i' for #<Hoge:0x007f9c4bbafe20>
これはハッシュでbuild/createするような場合も同様です。
# Rails3.2.9
hoge = Hoge.find(1)
params = { name: 'fuga', hoge_id: hoge }
piyo.build_fuga(parmas)
# NoMethodError: undefined method `to_i' for #<Hoge:0x007f9c4bbafe20>
解決策
解決策としてはhoge_id
にはhoge
オブジェクトではなく、hoge.id
のように、明示的にidを渡します。
# Rails3.2.9
hoge = Hoge.find(1)
piyo.hoge_id = hoge.id
piyo.hoge_id # => 1
備考
Rails3.2.8からRails3.2.10 or 3.2.11にバージョンアップした場合でも同じ問題が発生するので、注意してください。