2009-04-19 9 views
9

通常のhas_manyでは、親レコードが削除されたときに関連付けを削除するオプションが:dependent => :destroyです。 has_many :throughでは、他の親が子レコードに関連付けられている可能性があります。したがって、:dependent => :destroyは何の効果もありません。最後のhas_many:throughレコードが削除されたあとの関連付けを破棄します。

最後のHMT関連から孤児になった後、子レコードが確実に削除されるようにしますか?

答えて

12

私が見つけた解決策は、このようなafter_destroyコールバック、のようだ:結合モデルに

class Parent < ActiveRecord::Base 
    has_many :children, :through => :parentage 
    after_destroy :destroy_orphaned_children 

    private 

    def destroy_orphaned_children 
    children.each do |child| 
     child.destroy if child.parents.empty? 
    end 
    end 

end 
+0

は古い問題/解答に突くためにかかわらず、医師が破壊されると、患者を破壊し、そしてドクターhas_manyの患者にしたい場合は、私は 'にhas_many持っていた:through' assocationを。私はスルーモデルで「破壊」と呼んだが、孤立しているかもしれない関連の他のモデルを削除したかった。私はこのコードを私のスルーモデルの中に置きました。そして、最後のモデルは 'belongs_to'だけだったので、' each'呼び出しを取り除きました。正しい方向に押してくれてありがとう。 –

3

、 "belongs_toの:モデル、依存:破壊" を使用たとえば

を、あなたは予定

Class Appointment 
    belongs_to :doctor 
    belongs_to :patient, dependent: :destroy 

Class Doctor 
    has_many :appointments, dependent: :destroy 
    has_many :patients, through: :appointments 

Class Patient 
    has_many :appointments 
    has_many :doctors, through: :appointments 
+2

私はすべての患者を破壊するという考えが好きです:)) –

+0

私は彼の任命のすべてが破壊されたときにのみ患者を破壊したい。少なくとも1つのアポイントメントが残っている限り、私は患者を生存させたい(そうでなければ、彼は来ないだろう:-)あなたのアプローチはそれに適しているのか、アポイントメントの何人かが破壊されたときに患者を破壊するだろうか? – silverdr

関連する問題