has_many through の欠点に今更気づきました
次のようにありがちな、ユーザとグループの多対多のテーブル操作をhbtmで設定していたのですが、
User <---- Member ----> Group
has_many :through に変えるとプログラムが動かなくなってあせりました。
@user.groups = new_groups
代入じゃ保存されなくなってしまいました。
@user.groups << new_groups
これは動作する。
仕方ないので次の方法をとる。
追記:追加の処理がおかしかったので修正 (重複してた)
delete_groups = @user.groups - new_groups new_groups = new_groups - @user.groups #すでに登録されてるやつは外す delete_groups.each {|g| @user.groups.delete g } # こんなことしなくてもいい? @user.groups.reload @user.groups << new_groups
これならOKだと思いきや、ログを見てると INSERT SQL は発行されているけど、DELETE は見当たらず・・・。
結局、中間テーブルを直接操作するしかないんでしょうか・・・
ちなみに、環境は Rails2.0.2