답변

7

자세히 검사하면 HABTM 관계는 조인 테이블 항목을 제거해야합니다. 그러나 HABTM 관계 나이 솔루션의 원래 버전 (게시 내역 참조)에서 설명한 관계로 인해 delete 메서드로 레코드를 제거 할 때 이러한 조인 테이블 항목이 제거되지 않습니다. ActiveRecord::Base#delete은 HABTM 관계가 연결 테이블에서 고아 항목을 제거하기 위해 설정 한 것과 같은 콜백을 트리거하지 않습니다. 대신 ActiveRecord::Base#destroy을 사용해야합니다.

원시 SQL을 사용하여 불필요한 항목을 제거해야합니다. 조인 모델을 작성하려는 경우 조인 모델의 항목을 반복하여 연관없이 삭제할 수 있습니다.

예 : 조인 테이블에

class Foo < ActiveRecord::Base 
    has_many :foo_bars, :dependent => :destroy 
    has_many :bars, :through => :foo_bars 
end 

class FooBar < ActiveRecord::Base 
    belongs_to :foo 
    belongs_to :bar 
end 

class Bar < ActiveRecord::Base 
    has_many :foo_bars, :dependent => :destroy 
    has_many :foos, :through => :foo_bars 
end 

FooBar.all.each{|fb| fb.destroy? if fb.foo.nil? || fb.bar.nil? } 
+0

그렇다면 "FooBar.all.each {| fb | fb.destroy? if fb.foo.nil? || fb.bar.nil?}"이 필요하면 "dependent => : destroy" "어쨌든? – James

+0

"종속 => : 파괴"가 수행합니까? 그것은 보이지 않습니다. 파괴 등을 구현해야합니까? – James

+1

'FooBar.all.each {...}'는 조인 테이블에서 고아 레코드를 제거하는 것입니다. dependent \> : destroy로 표시된 조인 모델 연관과 has \ _many : though 관계로 이동 한 후, 속해있는 레코드를 삭제하면 조인 테이블의 레코드가 고아가되지 않습니다. 추가 : dependent => : destroy 옵션은 파괴하고있는 것과 관련된 모든 관련 레코드를 파괴합니다. 그러나 삭제시 트리거되지 않습니다. ActiveRecord :: Base # destroy, ActiveRecord :: Base # delete 및 ActiveRecord :: Associations :: ClassMethods에 대한 설명서를 읽어야합니다. – EmFi

0

항목은 특수 아무것도하지 않고도 삭제해야합니다. 이상한 상황이 발생하면 코드에 :delete_sql 옵션을 추가하여 동작을 변경할 수 있습니다. 조인의 다른 쪽에서 개체를 삭제하는 것은 기본 동작이 아닙니다.