2010-03-06 6 views
0

가 나는 다음과 같은 클래스가있다 발사 :레일 캐시 스위퍼 및 모델 콜백은

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_updatedo_something_cool 콜백 전에 (또는 아마도 동시에) 호출되고 있으며 문제를 일으키는 것입니다.

아무도 모델 콜백 후 스위퍼에서 after_update을 강제로 실행하는 방법을 알고 있습니까? 이것을 달성하는 더 좋은 방법이 있습니까?

업데이트/수정 : 아래의 답변과 달리 관찰자 콜백은 실제로 모델 콜백 이후 올바른 순서로 실행됩니다. 내가 이것을 발견했을 때, 뭔가 다른 것이 틀림 없다는 것을 깨달았습니다.

do_something_cool 메서드는 모든 vigil의 슬롯을 파괴하고 올바른 슬롯 수로 올바른 시간으로 바꿉니다. 관찰자는 철수가 얼마나 오래 지속되어야하는지 파악하기 위해 슬롯의 수에 의존합니다. 그래서 근본적인 문제는 모든 vigil 슬롯이 파괴되고 데이터가 캐싱 되었기 때문에 옵저버로부터 vigil.slots을 호출했을 때 캐시 된 (파괴 된 슬롯) 데이터를 사용하고있었습니다. 해결책 : do_something_cool 끝에있는 vigil.slots (true)를 호출하여 새로 생성 된 슬롯을 다시로드하거나 다시 캐시하십시오!

답변

4

동시에 실행되지는 않겠지 만 모델이 나타나기 전에 스위퍼 콜백이 실행되는 것 같습니다.

이 게시물이 도움이 될 수 있습니다 반쯤 소개 http://upstre.am/2007/10/27/using-and-testing-activerecordrails-observers/

('콜백 : after_read'검색) 그들의 관찰자에 대한 사용자 정의 콜백을 만들기 위해 노력했다. 이 메소드를 사용하여 모델이 완료되었을 때 호출되는 after_something_cool ARObserver 메소드를 작성할 수 있습니다.

class Vigil < ActiveRecord::Base 
    after_update :do_something_cool 

    private 
    def do_something_cool 
     # Sweet code here 
     callback :after_something_cool 
    end 
end 

class NewsFeedObserver < ActionController::Caching::Sweeper 
    observe Vigil 

    def after_something_cool 
    # Create a news feed entry 
    end 
end 

면책 조항 :이 해본 적이 당신을 위해 작동하지 않을 수 있습니다 :(그들을 위해 일 때문에 어떤 버전을 레일 사이에 난 항상 변덕으로 스위퍼를 발견했습니다

+0

이봐 대답을 주셔서 감사합니다 /! 다른 답변이 제공되지 않으면 확실히 현상금을 얻을 수 있습니다 :-) –

+0

정보를 제공해 주셔서 감사합니다. 당신의 대답은 조금 틀렸지 만 그것은 올바른 방향으로 가고 있습니다. 그래서 그것을 받아 들일 것입니다. 자세한 내용은 업데이트 된 질문을 참조하십시오. –

+0

그것이 잘못되었다고해도 도움이 되니 기쁘다! – deanWombourne