依存関係のあるレコードの削除

school [has_many] ⇒ classes [has_many] ⇒ students [has_many]

において schoolを1レコード 削除した際に関連するclasses及びそのclassesに関連するstudentsを 削除したいとする。

School.rb
has_many :classes, :dependent=>:delete_all

Class.rb
has_many :students, :dependent=>:delete_all

として school.destroyとするとschool及びclassesは削除されるがstudentsは削除されない。

f set to :destroy all the associated objects are destroyed alongside this object
 by calling their destroy method. 
If set to :delete_all all associated objects are deleted without calling their destroy method. 

ということで :destroy_allではdestroyを呼び出さずに削除されるようだ。 after_destoryなどを使うためにも以下のように:dependent⇒:destroyと変更する。

School.rb
has_many :classes, :dependent=>:destroy

Class.rb
has_many :students, :dependent=>:destroy

:dependent⇒:destroyはまとめて削除できるはずのclassレコードの削除も1レコードづつSQLでDELETEを発行するのに対して、 :dependent⇒:delete_allはwhereでschool_idを指定しまとめてclassのレコードを削除する。

モデルの関係が3以上ネストせず、after_destroyなどのコールバックを使用していない場合delete_allの方がパフォーマンスの面で有利のようだ。

rubyonrails/model/delete_associated_record.txt · 最終更新: 2012/11/09 03:04 by enibloadmin
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0