사용 ActiveRecord 이 있을 얻을 수 있는 방법 이전의 값을 기록하는 동안 after_update

StackOverflow https://stackoverflow.com/questions/607069

문제

설정을 사용하여 간단한 예제: 나는 1 개의 테이블(Totals)을 보유하고 합의 amount 열 각각의 레코드에서 두 번째 테이블(Things).

thing.amount 업데이트하고 싶은 단순히 추가 사이에 차이 오래된 가치와 새로운 값을 total.sum.

바로 지금 나는 빼 self.amountbefore_update 며 추가 self.amountafter_update.이 곳 방법으로 너무 많은 신뢰를 업데이트에 성공하고 있습니다.

제약: 나는 원하지 않는 단순히 다시 계산 합의 모든 트랜잭션이 있습니다.

질문: 간단히 말하고 싶 액세스는 원래 값이 중 after_update 콜백입니다.어떤 방법으로 당신이 와서 이렇게 할까요?

업데이트: 내가와 누가복음 Francl 의 아이디어.동 after_update 콜백 당신은 여전히 액세스 self.attr_was 값을 정확히 무엇이었습니다.나는 또 이동하기로 결정했으로 after_update 구현하고 싶기 때문에 이런 종류의 논리에 모델이다.이 방법은 아무리 방법을 결정을 업데이트 트랜잭션에서 나는 것을 알고 난 업데이트 합계는 트랜잭션의습니다.덕분에 모두 구현에 대한 제안.

도움이 되었습니까?

해결책

전과 같이 모두가 무엇에 대해 말하는 트랜잭션이 있습니다.

는 말했다...

ActiveRecord 으로 레일 2.1 유의 특성 값을 객체입니다.그래서 만약 당신이의 특성 total, 당신은 것입니다 total_changed? 방법 total_was 메서드를 반환하는 오래된 값입니다.

할 필요가 없이 아무것도 추가하는 모델을 추적이 더 이상입니다.

업데이트: 여기에 대한 문서 ActiveModel::러 로 요청합니다.

다른 팁

일부는 다른 사람을 언급의 포장이 모든 트랜잭션에서 그러나 내가 생각하는 당신을 위해 행하신; 신 트리거 롤백에 의해 제기한 예외의 오류에 대한 after_*콜백이 있습니다.

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

전체 콜백을 체인의 저장,저장!, 을 파괴하거나 전화 내에서 실행되는 트랜잭션이 있습니다.을 포함하는 after_*후크.모든 것이 잘 간밋한 후 실행 체인이 완료되었습니다.

는 경우 before_*콜백 작업을 취소하 ROLLBACK 가 발생합니다.를 실행할 수 있습 롤백을 높이는 예외에서 모든 콜백을 포함하여 after_*후크.그러나 이 경우 클라이언트의 요구는 그것을 알고 있어야하기 때문에 일반 저장을 올릴 것이다 그러한 예외는 대신 돌아오는 거짓입니다.

추가"_was"당신의 특성을 줄 것이고 이전 값을 저장하기 전 데이터입니다.

이러한 방법은 불 더러운 방법 방법이 있습니다.

Cheers!

모 변경된 필드와 그들의 오래되고 새로운 값을 각각:

person = Person.create!(:name => 'Bill')
person.name = 'Bob'
person.save
person.changes        # => {"name" => ["Bill", "Bob"]}

ActiveRecord::러 이 모듈은 기본적으로 제공되 ActiveRecord 에 대한 추적 특성을 변경합니다.그래서 사용할 수 있는 thing.amount_was 을 얻을 수 있습니다

이것을 추가하는 모델:

def amount=(new_value)
    @old_amount = read_attribute(:amount)
    write_attribute(:amount,new_value)
end

다음 사용하@old_amount 에서 당신의 after_update 코드입니다.

첫째,당신은 일을해야한다 이것은 트랜잭션에서 확인하는 귀하의 데이터가 함께 작성합니다.

당신의 질문에 대답할 수 있습을 설정 회원 가변 오래된 가치에 before_update,당신은에 액세스할 수 있습에서 after_update,그러나 이것은 매우 우아한 솔루션입니다.

이 1:Wrap 업데이트를 데이터베이스에서 거래되도록 업데이트에 실패하는 경우에 당신의 합계 표 바뀌지 않: ActiveRecord 거래 문서

이 2:숨기 오래된 가치에@old_total 동안 before_update.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top