色々奥が深いと思った(not http://0xc
■前提:記事←関連テーブル→ユーザというモデル関係がある。
1 # has_many :throughのパターン 2 class Article< ActiveRecord::Base 3 has_many :articles_u sers 4 has_many :users, :through => :articles_u sers 5 end 6 7 class User < ActiveReco rd::Base 8 has_many :articles_u sers, :dependent => :destroy 9 has_many :articles, :through => :articles_u sers 10 end 11 12 # 関連テーブルを実テーブルで持つ 13 class ArticlesUs ers < ActiveReco rd::Base 14 belongs_to :article 15 belongs_to :user 16 end
■関連テーブルの操作
あるユーザの関連をごそっと別の関連に切り替えたいような場合!
User.artic
AWD第二版(AgileWebDe
1 /ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_rec ord/associatio ns/associatio n_collecti on.rb 2 3 # Replace this collection with +other_arr ay+ 4 # This will perform a diff and delete/add only records that have changed. 5 def replace(other_arra y) 6 other_arra y.each { |val| raise_on_t ype_mismat ch(val) } 7 8 load_targe t 9 other = other_arra y.size < 100 ? other_arra y : other_arra y.to_set 10 current = @target.size < 100 ? @target : @target.to_set 11 12 @owner.transactio n do 13 delete(@target.select { |v| !other.include?(v) }) 14 concat(other_arra y.select { |v| !current.include?(v) }) 15 end 16 end
1.配列を放り込むだけ
「Replace this collection
2.以前の関連との差分をチェックして差分だけ反映してくれる。
「This will perform a diff and delete/add
ちなみにdeleteだと「Railsレシピブック」のP157「Entryオブジェクトobjectとの関連を削除する。Entryオブジェクトobjectの外部キー(blog_id)をNULLにし、関連を削除する。複数の参照元オブジェクトを同時に指定できる。」にある通り、関連テーブルの実レコードは削除されない(外部キーがNULLになるだけ)。関連テーブルにごみが残って気持ち悪い場合は上記モデルのように「:dependent