2012-03-26 2 views
11

I가 다음과 같은 모델 연결을 발사하지 쳐부 : 나는이 Slider 오브젝트를 파괴하면before_destroy 및 종속

class Slider < ActiveRecord::Base 
    has_one :featured_happening, :as => :featured_item, :dependent => :destroy 
    before_destroy :destroy_featured_happening 
    after_create :create_featured_happening 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item, :polymorphic => true 
end 

은 내가 dependent => :destroy 자동으로 featured_item를 파괴 할 것이라고 생각하지만 그렇지 않습니다.

슬라이더 컨트롤러

def destroy  
    slider = Slider.find(params[:id]) 
    slider.delete 
    render(:status => :ok, :nothing => true) 
    end 

그래서 그때 슬라이더 객체가 파괴 아무것도 호출지는 않는 경우 수동으로 featured_item을 삭제 before_destroy로 콜백을 시도했다.

어떻게 내가 슬라이더 개체를 삭제할 때 featured_item이 삭제 될 수 있습니까? Rails 3.2 사용하기.

+0

어떻게 'Slider' 인스턴스를 삭제 하시겠습니까? 렌더링 slider.delete : –

+0

데프 슬라이더 Slider.find = ([ID] PARAMS)를 파괴하지 (: 상태 => 확인 => 사실 아무것도) 단부도 주목을 – chell

답변

19

방금 ​​deletedestroy의 차이를 관찰했습니다. 컨트롤러에서 당신은 단지 SQL DELETE를 실행합니다 있지만 콜백을 호출하지 않습니다

slider.delete 

를 호출합니다. 그렇기 때문에 보통의 경우 destroy을 대신 사용하려고합니다. 객체를 가져오고 (필요한 경우) 재귀 적 소멸을 포함하여 콜백을 호출 한 다음 데이터베이스에서 객체를 삭제합니다.

자세한 내용은 deletedestroy에 대한 설명서를 참조하십시오.

+0

이런. 나는 항상 하나가 다른 하나의 별칭이라고 생각했다. 감사. –

4

는 콜백을 트리거하기 위해 Slider#destroy를 호출되어 있는지 확인하십시오. Slider#delete은 단순히 레코드를 호출하지 않고 레코드를 삭제합니다.

0
class Slider < ActiveRecord::Base 
    has_one :featured_happening, :dependent => :destroy 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item 
end 

귀하의 코드가 단순한 관계가있는 것처럼 간단하다면. 그런 다음 슬라이더를 삭제하면 Feature Happing이 삭제되고 슬라이더가 삭제됩니다. 그러나 당신의 경우 관계는 다형성입니다. DB의 feature happing table에서 abject_id는 슬라이더의 id이거나 다른 클래스 일 수 있습니다. 따라서 종속성은 파괴되지 않습니다. 따라서 먼저 레코드를 검색하고 파기하는 before_destroy 콜백을 사용하여 레코드를 삭제해야합니다.