有人在Rails中实现了after_commit
挂钩吗?在更新/创建/等提交后,我不是在寻找基于模型的模型,我希望能够动态定义仅在当前(最顶层)事务通过时才会执行的块:
def remove_file
current_transaction.after_commit do
FileUtils.rm(file_path)
end
end
如果它已经实现了,如果它将在rails 3.0中,那么有什么想法吗?
答案 0 :(得分:6)
Rails 3提供after_commit / after_rollback回调:https://github.com/rails/rails/commit/da840d13da865331297d5287391231b1ed39721b
在Rails 1和2中,您可以使用此gem获得相同的功能:https://github.com/freelancing-god/after_commit
答案 1 :(得分:3)
这是Rails 3中的Rails核心。
此处的文档:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#M001117
答案 2 :(得分:2)
你不会在Rails 3.0中看到after_commit
,至少现在还没有。您可以应用补丁,看看它是否得到了核心团队的批准,但我对此表示怀疑。在插件中,此功能在Rails核心之外仍然具有更多功能。
你可以尝试这个插件:
答案 3 :(得分:1)
我创建了一个轻量级的after_commit插件:after_commit plugin 它启用以下语法:
def some_callback
after_commit do
# save file, expire cache, etc
end
end
它非常轻巧但可以胜任。
答案 4 :(得分:1)
由于OP询问动态设置在提交事务后要执行的代码,因此after_commit不能解决他的问题。幸运的是,有after_commit_queue gem可以解决这个问题。
使用OP的示例,代码如下所示:
include AfterCommitQueue
def remove_file
run_after_commit do
FileUtils.rm(file_path)
end
end