Rails after_commit?

时间:2010-02-08 10:13:04

标签: ruby-on-rails transactions

有人在Rails中实现了after_commit挂钩吗?在更新/创建/等提交后,我不是在寻找基于模型的模型,我希望能够动态定义仅在当前(最顶层)事务通过时才会执行的块:

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

如果它已经实现了,如果它将在rails 3.0中,那么有什么想法吗?

5 个答案:

答案 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)

答案 2 :(得分:2)

你不会在Rails 3.0中看到after_commit,至少现在还没有。您可以应用补丁,看看它是否得到了核心团队的批准,但我对此表示怀疑。在插件中,此功能在Rails核心之外仍然具有更多功能。

你可以尝试这个插件:

http://github.com/GUI/after_commit

答案 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