2012-05-10

railsでhas_manyで関連したモデルのデータを一気に消すとき

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsでhas_manyで関連しているモデルで親モデルのデータを消したら関連するモデルのデータも連動して消したいときのお話です。

そんなときは、
:dependent
を指定してあげればよいわけですが、
:dependentに指定できるものに
:destroy

:delete_all
があります。違いはひとつひとつ消していくか、一気に消すかの違いです。 詳しくは、
http://rubyist.g.hatena.ne.jp/rochefort/20091126
が参考になります。

関連が1段階ならば、:delete_allの方がよさげな感じなのですが、
関連が2段階以上まであって、最後まで連動させてdeleteしたいときは、delete_allではだめです。
少なくとも子はひとつひとつ処理をする:destroyにしないと孫まで消えないです。

以下みたいな感じにしておけば、
fooを一つ消せば、これに関係するbar、barに関連するbooのデータが消えるようになります。
class Foo < ActiveRecord::Base
  has_many :bars, :dependent => :destroy
end

class Bar < ActiveRecord::Base
  has_many :boos, :dependent => :delete_all
end

class Boo < ActiveRecord::Base
end

コメントを投稿