레일의 HABTM 조인 테이블에서 항목을 삭제하려면 어떻게해야합니까?
문제
테스트의 많은 반복을 통해 두 모델 간의 HABTM 관계를 나타내는 조인 테이블은 이러한 모델의 인스턴스가 삭제 될 때 항목을 제거하지 않는다는 것을 알았습니다. HABTM 관계가있는 모델의 인스턴스를 제거 할 때 특별한 일을해야합니까?
해결책
면밀히 검사하면 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? }
다른 팁
조인 테이블의 항목은 특별한 일을하지 않고 삭제해야합니다. 당신은 추가 할 수 있습니다 :delete_sql
이상한 상황이있는 경우 동작을 변경하는 코드 옵션. 결합의 다른쪽에있는 객체를 삭제하는 것은 기본 동작이 아닙니다.
제휴하지 않습니다 StackOverflow