많은 테스트 반복을 통해 두 모델 간의 HABTM 관계를 나타내는 조인 테이블이 이러한 모델의 인스턴스가 삭제 될 때 항목을 제거하지 않는다는 것을 알게되었습니다. HABTM 관계가있는 모델 인스턴스를 제거 할 때 특별한 조치가 필요합니까?레일에서 HABTM 조인 테이블의 항목을 삭제하려면 어떻게해야합니까?
4
A
답변
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
항목은 특수 아무것도하지 않고도 삭제해야합니다. 이상한 상황이 발생하면 코드에 :delete_sql
옵션을 추가하여 동작을 변경할 수 있습니다. 조인의 다른 쪽에서 개체를 삭제하는 것은 기본 동작이 아닙니다.
그렇다면 "FooBar.all.each {| fb | fb.destroy? if fb.foo.nil? || fb.bar.nil?}"이 필요하면 "dependent => : destroy" "어쨌든? – James
"종속 => : 파괴"가 수행합니까? 그것은 보이지 않습니다. 파괴 등을 구현해야합니까? – James
'FooBar.all.each {...}'는 조인 테이블에서 고아 레코드를 제거하는 것입니다. dependent \> : destroy로 표시된 조인 모델 연관과 has \ _many : though 관계로 이동 한 후, 속해있는 레코드를 삭제하면 조인 테이블의 레코드가 고아가되지 않습니다. 추가 : dependent => : destroy 옵션은 파괴하고있는 것과 관련된 모든 관련 레코드를 파괴합니다. 그러나 삭제시 트리거되지 않습니다. ActiveRecord :: Base # destroy, ActiveRecord :: Base # delete 및 ActiveRecord :: Associations :: ClassMethods에 대한 설명서를 읽어야합니다. – EmFi