2010-02-08 11 views
6

क्या किसी ने रेल में after_commit हुक लागू किया है? मैं अद्यतन पर प्रतिबद्ध के बाद आधारित मॉडल के लिए नहीं देख रहा हूँ/बनाएँ/आदि, मैं गतिशील रूप से एक ब्लॉक है कि निष्पादित किया जाएगा परिभाषित करने के लिए सक्षम होना चाहते हैं केवल यदि वर्तमान (सर्वोच्च) लेन-देन से गुजरता है:रेल के बाद_commit?

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

कोई विचार अगर यह पहले ही लागू हो चुका है, अगर यह रेल 3.0 में होगा?

+0

आप एक after_save करते हैं और जाँच लें कि आपके वस्तु अद्यतन किया गया है नहीं कर सकते? – marcgg

+0

यह काम करेगा यदि आपका लेनदेन केवल एक मॉडल के सेव ऑपरेशन को लपेटता है। मुझे कम से कम 'नोड + संस्करण + अटैचमेंट' लपेटने की ज़रूरत है ... – gaspard

उत्तर

2

आप कम से कम अभी तक रेल 3.0 में after_commit नहीं देखेंगे। आप एक पैच लागू कर सकते हैं और देख सकते हैं कि यह कोर टीम द्वारा अनुमोदित हो जाता है, लेकिन मुझे संदेह है कि यह होगा। यह कार्यक्षमता एक प्लगइन में रेल कोर के बाहर और अधिक कार्यात्मक बनी हुई है।

आप इस प्लगइन की कोशिश कर सकते हैं:

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

चूंकि ओपी ने एक लेनदेन के बाद गतिशील रूप से कोड को निष्पादित करने के बारे में पूछा, उसके बाद उसकी समस्या हल नहीं होती है। सौभाग्य से after_commit_queue मणि है जो वास्तव में इस समस्या को हल करता है।

ओपी के उदाहरण का उपयोग करना, कोड इस तरह दिखेगा:

include AfterCommitQueue 

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