2010-02-08 2 views
6

누구나 레일에 after_commit 후크를 구현 했습니까?레일즈 after_commit?

def remove_file 
    current_transaction.after_commit do 
    FileUtils.rm(file_path) 
    end 
end 

하나를 : 나는/현재 (맨 위) 트랜잭션이 통과하는 경우에만 나는 동적으로 실행됩니다 블록을 정의 할 수 있도록하려면, 등을 ​​생성/업데이트에 대한 커밋 후 기반 모델을 찾고 있지 않다 만약 이것이 레일 3.0에 있다면, 이미 구현 되었다면 어떻게 될까?

+0

당신은 after_save을하고 개체가 업데이트되었는지 확인할 수 없습니다? – marcgg

+0

트랜잭션이 단일 모델의 저장 작업만을 래핑하는 경우이 작업이 가능합니다. 적어도 Node + Version + Attachment를 포장해야합니다 ... – gaspard

답변

2

적어도 아직 레일즈 3.0에는 after_commit이 표시되지 않습니다. 패치를 적용하고 핵심 팀의 승인을 받았는지 확인할 수는 있지만 의심 스럽습니다. 이 기능은 플러그인에서 Rails 코어 밖에서 훨씬 더 기능적으로 남아 있습니다.

이 플러그인을 시도 할 수 있습니다 :

http://github.com/GUI/after_commit

+0

플러그인을 살펴 봤지만 커밋 후 정의하는 정적 인 방법이며, 내가 본 것에서 단일 모델에 매달 렸습니다. 저장하는 동안'after_commit' 콜백에 추가하는 것을 선호합니다. – gaspard

1

나는 가벼운 after_commit 플러그인을 만든 다음 구문을 가능하게 after_commit plugin 을 :

def some_callback 
    after_commit do 
    # save file, expire cache, etc 
    end 
end 

그것은 매우 경량하지만 일을한다.

1

OP는 트랜잭션이 커밋 된 후 실행되도록 동적 설정 코드에 대해 질문했기 때문에 after_commit은 문제를 해결하지 못합니다. 다행히 정확히이 문제를 해결하는 after_commit_queue 보석이 있습니다.

하는 영업 이익의 예를 사용하여, 코드는 다음과 같습니다

include AfterCommitQueue 

def remove_file 
    run_after_commit do 
    FileUtils.rm(file_path) 
    end 
end