2016-06-15 1 views
0

서류 추적 기능이있는 모델이 있습니다. 내 API 경로 중 하나에서 the_model.update_columns ...을 실행하여 관련 콜백을 모두 트리거하지 않고 모델 인스턴스를 수정 (저장) 할 수 있도록해야합니다.이 콜백에는이 특정 기능에 대해 원하지 않는 부작용이 있습니다. 노선).ActiveRecord 모델을 업데이트 할 때 paper-trail을 제외한 모든 콜백을 건너 뛰는 방법은 무엇입니까?

그러나 이 변경 사항은 여전히 ​​페이퍼 트레일으로 기록되기를 바랍니다. 내가 성취 할 수있는 합리적인 방법이 있습니까?

+0

그것은 소리처럼 말 그대로 항상 모든 변화에서 발생하지 않으려면 당신의 콜백에서 일을 제거하는 더 나을 것 . 나는 당신의 설명에서 당신이 X를 원하지만 Z가 거짓 인 경우 Y가 아니라고 말할 수 있다고 말할 수 있습니다. 그냥 제거하고 수동으로 메소드를 호출하십시오. –

답변

0

이 단순하고 투박하지만, 그것은 당신이 원하는 것을 정확히 끝낼 것 :

class ThisModel < ActiveRecord::Base 
    ... 
    def update_me_no_callbacks(att_1, attr_2, attr_3, ...) 
    self.update_columns(
     attr_1: attr_1, 
     attr_2: attr_2, 
     attr_3: attr_3, 
     ... 
    ) 

    # Do paper-trail code 
    end 
end 
+0

감사합니다. 슬프게도,'# Do-Trail Code'는 제 문제의 일부입니다. :-) 필자는 종이 트레일을 수동으로 트리거하는 문서화 된 방법을 찾을 수없는 것 같습니다. – Malabarba

+0

어쨌든, 내 현재 솔루션은 내 콜백의 ** all ** 이후에': : some_predicate? '를 추가하는 것입니다. 그런 다음 콜백을 실행하지 않으려면 해당 조건자를 'true'로 반환하도록 정의하십시오. 약간 번거 롭긴하지만 종이 트레일 콜백은 여전히 ​​실행됩니다. – Malabarba