2013-06-24 2 views
3

가의가 있다고 가정 해 봅시다 파괴 가입 : 그것은 캠페인 간단레일 내가 다음과 같은 모델을 가지고, 모델에 따라 다름이

class Campaign < ActiveRecord::Base 
    has_many :targetings 
    has_many :devices, :through => :targetings 
    attr_accessible lalalala, :device_ids 
end 

class Device < ActiveRecord::Base 
    has_many :targetings 
    has_many :campaigns, :through => :targetings 
end 

class Targetings < ActiveRecord::Base 
    belongs_to :campaign 
    belongs_to :targeting 
    has_many :docs, :dependent => :destroy 
end 

class Doc < ActiveRecord::Base 
    belongs_to :targeting 
end 

- 모델 (타겟팅이)에 가입하여 장치의 many-to-many 연관이. 목표 지정에는 많은 관련 문서가 있습니다. 대상을 파괴 할 때 파괴하고 싶습니다.

편집 페이지에는 '캠페인 [device_ids]'이라는 체크 박스 세트가 있으며 현재 캠페인의 기기를 선택하는 데 사용됩니다.

나는 캠페인attr_acessibledevice_ids을 추가하고, 레일 어떻게 든 캠페인장치 사이의 연결을 관리 할 수 ​​있었다 : 그것은 암시 모델을 대상으로 만듭니다.

그러나 캠페인과 기기 간의 연결을 삭제하면 타겟팅 모델이 삭제되지만 해당 타겟팅과 연결된 문서는 삭제되지 않습니다.

예 : 초기 상태의

Devices: 
    id: 1 
    title: A 
    ---- 
    id: 2 
    title: B 

Campaigns: 
    id: 1 
    title: CA 

Targetings: 
    id: 1 
    device_id: 1 
    campaign_id: 1 

Docs: 
    id: 1 
    content: lalala 
    targeting_id: 1 

. 내가 요청하는 경우 : device_ids = [2]POST campaign/1/update을, 나는

Docs: 
    id: 1 
    content: lalala 
    targeting_id: 1 

그래서, 타겟팅이 [ID = 1] 삭제 된 여전히

Targetings: 
    id: 2 
    device_id: 2 
    campaign_id: 1 

하지만이있을 것이다, 그러나 의존 문서가 삭제되지 않았습니다.

예상되는 동작입니까? 연결을 수동으로 업데이트해야합니까? 그렇다면 올바른 방법은 무엇입니까?

P. 타겟팅은 항상 암시 적으로 만들어야합니다.

+1

,하지만 당신은'시도 캠페인 has_many 있습니다 타겟팅이를 : 의존 => : 파괴? 조인 테이블 레코드가 기본적으로'destroyed'보다는'deleted'인지 여부가 궁금합니다. 콜백을 건너 뛸 것입니다 (종속 레코드를 더 파기하는 것과 같습니다). – gregates

+1

@ 집합체 불행히도, 그것은 아무런 영향을 미치지 않습니다. 의존적 인 문서는 여전히 손대지 않습니다.그 이유는 관리를 목표로하는 어딘가에있는 이유 다. device_ids = method를 다시 정의하고 수동으로 연결을 관리하려고 시도합니다. –

답변

3

그것은 모델을 조인

자동 삭제 직접, 더 파괴입니다 (공식 문서에서 )처럼 보인다는 콜백이 트리거 입니다.

언뜻보기에는 분명한 결정이 아닙니다. 나는 성능상의 이유로 그렇게 생각합니다. 는 그러나, 나는 장치 협회에 after_remove 후크를 사용하여 위의 문제를 해결할 수 있었다 :이 작동하는지 모르는

has_many :devices, :through => :targetings, :before_remove => :destroy_targeting 

def destroy_targeting(device) 
    Targeting.where(campaign_id: id, device_id: device.id).destroy_all 
end 
관련 문제