가 나는 다음과 같은 클래스가있다 발사 :레일 캐시 스위퍼 및 모델 콜백은
class Vigil < ActiveRecord::Base
after_update :do_something_cool
private
def do_something_cool
# Sweet code here
end
end
class NewsFeedObserver < ActionController::Caching::Sweeper
observe Vigil
def after_update
# Create a news feed entry
end
end
모든 것이 예상 작품으로, 그러나 스위퍼의 after_update
은 올바르게 실행되기 전에 모델의 do_something_cool
메서드가 완료되어야합니다. 문제는 스위퍼에있는 after_update
이 do_something_cool
콜백 전에 (또는 아마도 동시에) 호출되고 있으며 문제를 일으키는 것입니다.
아무도 모델 콜백 후 스위퍼에서 after_update
을 강제로 실행하는 방법을 알고 있습니까? 이것을 달성하는 더 좋은 방법이 있습니까?
업데이트/수정 : 아래의 답변과 달리 관찰자 콜백은 실제로 모델 콜백 이후 올바른 순서로 실행됩니다. 내가 이것을 발견했을 때, 뭔가 다른 것이 틀림 없다는 것을 깨달았습니다.
do_something_cool
메서드는 모든 vigil의 슬롯을 파괴하고 올바른 슬롯 수로 올바른 시간으로 바꿉니다. 관찰자는 철수가 얼마나 오래 지속되어야하는지 파악하기 위해 슬롯의 수에 의존합니다. 그래서 근본적인 문제는 모든 vigil 슬롯이 파괴되고 데이터가 캐싱 되었기 때문에 옵저버로부터 vigil.slots
을 호출했을 때 캐시 된 (파괴 된 슬롯) 데이터를 사용하고있었습니다. 해결책 : do_something_cool
끝에있는 vigil.slots (true)를 호출하여 새로 생성 된 슬롯을 다시로드하거나 다시 캐시하십시오!
이봐 대답을 주셔서 감사합니다 /! 다른 답변이 제공되지 않으면 확실히 현상금을 얻을 수 있습니다 :-) –
정보를 제공해 주셔서 감사합니다. 당신의 대답은 조금 틀렸지 만 그것은 올바른 방향으로 가고 있습니다. 그래서 그것을 받아 들일 것입니다. 자세한 내용은 업데이트 된 질문을 참조하십시오. –
그것이 잘못되었다고해도 도움이 되니 기쁘다! – deanWombourne