2012-05-31 3 views
2

ActiveRecord의 다른 모든 before_save 콜백이 코드에서 실제로 그렇게 정렬되지 않으면 주어진 before_save 콜백이 실행되도록 보장 할 방법이 있습니까?레일 3 : before_save 콜백이 다른 코드보다 먼저 호출되는지 확인

일부 before_save 기능을 포함하는 외부 라이브러리를 작성하고 있지만 효과적이기 위해서는 다른 모든 라이브러리보다 먼저 호출해야합니다. 나는 그 주위를 돌아 다닐 수는 있지만, 정말로 원하지 않는 더러운 속성을 포기해야합니다!

- 편집 -

나는이 그 더러운 속성에 몰랐 모델의 퇴피 후 유지됩니다. 따라서 @ page.attribute_was는 around_saveyield 이후에도 계속 작동합니다.

답변

5

마지막으로 실행하려는 콜백을 around_save 콜백으로 만들 수 있습니다. list of available 콜백을 확인하고 일부 콜백에 다른 콜백 "버킷"을 사용하여 원하는 순서대로 실행되는지 확인할 수 있습니다. 당신은 여전히 ​​여러 before_save 콜백 결국 마지막 트리거를해야하는 경우

, 당신은 before_split_save 콜백으로 일반 before_save 콜백을 등록, 어쩌면 define_model_callbacks :split_save처럼, 사용자 정의 콜백을 만들 수는 after_split_save으로 마지막으로 실행 원하는 것을 할 수 있습니다 콜백, 두 개의 콜백 그룹 (run_callbacks :split_save)을 실행하는 단일 before_save 콜백. 이 작업을 수행하는 방법에 대한 자세한 내용은 ActiveModel::Callbacks을 참조하십시오.

+0

감사합니다. Carl. 나는'around_save'를 사용하고'yield '앞에 코드를 넣으려고 시도했지만,'before_save'는 여전히 후에 호출되고 있습니다. 나는 그것을 해결할 수 없었다. 내일 확실히 ActiveModel :: Callbacks를보고 다시보고 할 것입니다. –

+0

@JonHope 예, 실제로'around_save'를 사용한 적이 없습니다. 문서를 살펴보면 before_save 콜백 후에 항상 * 발생해야하지만 "주변"콜백은 조금 다르게 작동하므로 오해가있을 수 있습니다. 마지막 callback을'after_validation' 콜백으로 끝내고'before_save'를 남기고 싶은 콜백을 제외하고 모든 콜백을 시도해 볼 수도 있습니다. 사용자 정의 콜백도 작동하지만'after_validation'을 사용하면 작업량을 줄일 수 있습니다. –

+0

Carl에게 감사드립니다. 불행히도 나는 드롭 인 솔루션으로 보석을 필요로하기 때문에 커스텀 콜백을 사용할 수 없다. 사람들이 콜백 코드를 변경할 수 없다. 내 생각에는 개체가 저장되기 전에 콜백 배열을 찾고 끝에 수동으로 광산을 추가하는 것입니다. 이 사람? –

1

이렇게하면 더러운 특성 changes이 저장 후 지워지기 때문에 after_<type> 콜백 대신 주문한 before_<type> 콜백을 사용하여 더러운 특성을 포기할 수 있습니다.

그러나 changes은 콜백 after_<type> 콜백에서 계속 액세스 할 수 있습니다.

나는 그들이 이것을 한 방법을보기 위해 Vestal Versions 코드를 통해 트롤링 한 후에 이것을 해결했습니다.

Facepalm.

오히려 잘못 제시 한 질문에 대한 완전한 답변이기 때문에 Carl의 답변을 수락합니다.

관련 문제