2012-02-17 3 views
6

나는 destroy 메쏘드의 동작을 덮어 쓰는 데 많은 노력을했지만 아무 것도 작동하지 않는다. 먼저 acts_as_paranoia 플러그인을 사용했지만 has_many : in association의 모델에서는 작동하지 않습니다.레일 : 덮어 쓰는 방법 : 파괴 방법?

내가 덮어 쓰려면 : 그냥이 같은 것을 할 방법을 파괴 :

입니다
def destroy 
    _run_destroy_callbacks { delete } 
    end 

    def delete  
    self.update_attribute(:status => 0) 
    freeze 
    end 

가, 난 그냥 대신에 기록 자체를 파괴하는 (0 상태) 다른 필드를 업데이트합니다.

답변

5

는 시도 있나요?

class MyClass < ActiveRecord::Base 
    def destroy 
    update_attribute(:status, 0) 
    end 
end 

편집이 : 의견을 바탕으로,이 일에 뭔가 다른 수 있습니다 그것은 바로 수 있습니다 : 협회의 정의에 (종속 => '') 지정 - 또는 HABTM 인 경우 전혀 작동하지 않을 수 있습니다. 어쩌면 this info on delete and destroy through associations가 도움이 될까요? 아래에 붙여 넣은 관련 섹션 :

삭제 하시겠습니까?

has_many 및 has_and_belongs_to_many 연관에는 destroy, delete, destroy_all 및 delete_all 메서드가 있습니다.

has_and_belongs_to_many의 경우 삭제 및 파기가 동일합니다. 은 조인 테이블의 레코드를 제거하도록합니다.

has_many의 경우 destroy는 콜백이 실행되도록 제거 될 레코드 ( )의 destroy 메소드를 항상 호출합니다. 따라 옵션을, 또는 어떤 경우 : 그러나 가 에 의해 지정된 전략에 따라 삭제를 할 것 중 하나를 삭제 의존하는 옵션이 주어지지, 그것은 기본 전략을 따를 것이다. 기본 전략은 다음과 같습니다. 외부 키를 0 이외의 값으로 설정하고 has_many : through를 제외하고 default 전략은 delete_all입니다 (해당 콜백을 실행하지 않고 결합 레코드 삭제).

@varietal = Varietal.find('1')  
@varietal.destroy 

def destroy 
    update_attribute(:status, 0) 
end 

이 완벽하게 작동합니다 마이킹의 말처럼 우리는 "수동"는 품종을 파괴하려는 경우

+0

예, 제가 시도한 것은 처음이었습니다. 이것은 아무것도하지 않습니다. 내 로그에서 DELETE FROM 요청을 볼 수 있습니다. 커스텀 destroy 메소드는 호출되지 않는 것 같습니다. –

+0

Hrm, 실제로 여러 앱의 여러 모델에서 이것을 사용하며 실패없이 작동합니다. 이 특정 모델에 '특별한'것이 있습니까? 삭제 또는 삭제를 호출 하시겠습니까? 후자를 원할 것입니다. – miked

+0

AREL (ActiveRecord 관계)에서 해당 레코드가 부모로부터 삭제되었습니다. 아마도 문제일까요?실제로, 나는 와인 모델과 기록을 갱신하고 (주 양식, 컨트롤러의 업데이트 방법), 아이를 지우도록 선택한 경우 (사용자 정의 파괴가 포함 된 품종 모델) 분명히 호출되지 않습니다. 어쩌면, 레일 메카니즘은 자식을 파기하는 부모 (파손을 자식 모델에서 호출하지 않는 것)를 파기하는 것과는 다르다. –

0

,이 코드는 좋은했다. 그러나 부모 레코드를 업데이트하면 아이에게 호출 된 destroy/delete/delete 메서드를 찾지 못했습니다 ... 누군가가 아이디어를 가지고 있다면 ...

2

def Model 
    before_destroy: mark_as_deleted 

    def mark_as_deleted 
     self.update_attribute(:status => 0) 
    end 
end 

이 비록 destroy을 취소 할 것 :이 작업을 수행하는 방법은 부양 가족을 조작 할 before_destroy: 필터를 덮어하는 것입니다.

The full callback documentation is here.

+0

이것은 여전히 ​​컨트롤러에서 destroy()를 호출합니다. 그냥 def를 먼저 실행합니다. 거짓을 돌려주는 것은 적어도 내가 말할 수있는 것은 아닙니다. –

관련 문제