有沒有人在Rails中實現了after_commit
hook?我不是在尋找基於更新提交後的模型/新建/ etc,我希望能夠動態地定義將要執行的塊只有在當前(最上面的)交易通:Rails after_commit?
def remove_file
current_transaction.after_commit do
FileUtils.rm(file_path)
end
end
任何想法,如果這已經實施,如果它將在軌道3.0?
有沒有人在Rails中實現了after_commit
hook?我不是在尋找基於更新提交後的模型/新建/ etc,我希望能夠動態地定義將要執行的塊只有在當前(最上面的)交易通:Rails after_commit?
def remove_file
current_transaction.after_commit do
FileUtils.rm(file_path)
end
end
任何想法,如果這已經實施,如果它將在軌道3.0?
在Rails 3.0中你不會看到after_commit
,至少現在還沒有。你可以申請一個補丁,看看它是否得到核心團隊的批准,但我懷疑它會。在一個插件中,這個功能在Rails核心之外保持更多功能。
你可以試試這個插件:
我看了一下這個插件,但它是提交後定義的一種靜態方式,它們與我所看到的單一模型掛鉤。我會在保存時向pre_commit回調添加一些內容。 – gaspard 2010-02-09 12:05:30
我創建了一個輕量級的after_commit插件:after_commit plugin ,使語法如下:
def some_callback
after_commit do
# save file, expire cache, etc
end
end
它非常輕巧,但做這項工作。
這是在Rails的Rails的核心3.
文檔瀏覽:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#M001117
的Rails 3提供after_commit/after_rollback回調:https://github.com/rails/rails/commit/da840d13da865331297d5287391231b1ed39721b
在Rails 1和2即可獲得相同的功能使用這個寶石:https://github.com/freelancing-god/after_commit
由於OP詢問在提交事務後動態設置要執行的代碼,after_commit不能解決他的問題。幸運的是,有確切解決這個問題的gem after_commit_queue。
使用OP的例子中,代碼應該是這樣的:
include AfterCommitQueue
def remove_file
run_after_commit do
FileUtils.rm(file_path)
end
end
你能不能做一個after_save的檢查,如果你的對象已更新? – marcgg 2010-02-08 10:21:52
如果您的交易僅包裝單個模型的保存操作,則這將起作用。我需要至少包裝'Node + Version + Attachment' ... – gaspard 2010-02-09 12:02:42