2009-10-19 3 views
71

모델 저장 후 실행되는 레일에 콜백 함수를 생성하고 싶습니다.모델에서 속성 변경을 감지하는 방법은 무엇입니까?

나는 거절이 모델하는 속성 가능한 값 승인, 승인, 보류중인 주장의 상태에 따라 변경 '상태'를 가지고 주장을,이 데이터베이스는 기본적으로 '상태'가

값은 '보류 중'입니다.

모델이 처음 생성되거나 특정 상태가 변경된 상태에 따라 특정 상태로 업데이트 된 후 특정 작업을 수행하고 싶습니다.

after_save :check_state 

    def check_state 
     # if status changed from nil to pending (created) 
     do this 

     # if status changed from pending to approved 
     performthistask 
    end 

내 질문은 어떻게하는 모델 내의 변경 전의 이전 값을 확인합니까된다

내 생각은 모델의 기능을 가지고있다?

답변

148

당신은 ActiveModel::Dirty 모듈 봐야한다 : 당신은 당신의 청구 모델에 다음과 같은 작업을 수행 할 수 있어야한다 :

claim.status_changed? # returns true if 'status' attribute has changed 
claim.status_was  # returns the previous value of 'status' attribute 
claim.status_change # => ['old value', 'new value'] returns the old and 
         # new value for 'status' attribute 

claim.name = 'Bob' 
claim.changed # => ["name"] 
claim.changes # => {"name" => ["Bill", "Bob"]} 

오! Rails의 즐거움! 당신은 또한 변경 컬럼의 해시를 반환

self.changes 

을 사용할 수 있습니다

+4

그가 요청한 모델을 저장 한 후에는 작동하지 않습니다. –

+3

@TomRossi,'dirty' 호출은'after_save'에서 작동합니다 (레일즈 2.3과 3.x 모두). 나는 그것을 여러 번 사용했다. –

+8

@TomRossi, 커밋 후 더티 플래그가 재설정되므로 Rails 3.x에 도입 된'after_commit' 콜백에서 사용할 수 없습니다. 그들은'after_save'에서 확실히 작동 할 것입니다. –

3

은 당신이 사용 가능한 상태 머신 플러그인 중 하나에서보세요 추천 :

어느 하나의 상태 사이 당신에게 설치 상태 및 전환을하게됩니다. 요구 사항을 처리하는 데 매우 유용하고 쉬운 방법입니다.

+0

나는 rubyist-aasm에게 시험해보고 있습니다. 내가 클래스 청구가 있다고 가정하자 <: 상태 aasm_initial_state : 액티브 :: 자료 는 AASM aasm_column을 포함 aasm_state 출원 :, 보류 : = 입력> : 데프 알리미를 enter_pending enter_pending.deliver_pending_notification (self) end end 내 데이터베이스의 상태 필드는 기본값이 "보류 중"입니다. 상태 필드를 채우지 않고 Claim.create를 수행하면 (보류 중으로 실행 됨) AASM이 'enter_pending'메소드를 실행합니까? –

33

이이

self.changed 

는이 기록

에서 변경된 모든 열의 배열을 반환 사용할 수 있습니다 배열 전후의 결과입니다.

+4

'self.'를 사용할 필요가 없다고 말하는 것은 약간의 메모입니다.'changed'라고 말할 수 있습니다. 및 '변경'. – user664833

0

많은 장소에서 코드를 조금 더 멋지게 만들기 위해 작은 루비 젬을 썼다. (그리고 if/else 문은 어디에서나 피할 수있다.) https://github.com/ronna-s/on_change. 도움이 되었기를 바랍니다.

0

state_machine 보석과 같이 잘 테스트 된 솔루션을 사용하는 것이 훨씬 나을 것입니다.

관련 문제