Rails 3:确保在其他人之后调用before_save回调

时间:2012-05-31 17:23:47

标签: ruby ruby-on-rails-3 activerecord

有没有办法确保在ActiveRecord中的所有其他before_save回调之后执行给定的before_save回调,而不是在代码中实际排序它们?

我正在编写一个包含一些before_save功能的外部库,但为了有效,它确实需要在所有其他功能之后调用。我可以解决它,但它涉及放弃我真正不想要的脏属性!

- 编辑 -

我没有意识到在保存模型后维护了脏属性。因此@ page.attribute_was仍然可以在yield中的around_save之后使用。

2 个答案:

答案 0 :(得分:5)

您可以将要执行的回调最后一次around_save回调。查看list of available回调,看看是否可以为一些回调使用不同的回调“存储桶”,以确保它们按所需顺序执行。

如果你仍然有多个before_save回调,并且最后需要一个回调,你可能想创建自定义回调,例如define_model_callbacks :split_save,将常规before_save回调注册为{ {1}}回调,您最后要作为before_split_save回调执行的回调,然后只运行这两组回调(after_split_save)的单个before_save回调。有关如何执行此操作的详情,请参阅ActiveModel::Callbacks

答案 1 :(得分:1)

所以这是通过使用有序before_<type>回调而不是after_<type>回调来绕过放弃脏属性,因为保存后会删除脏属性changes

然而,事实证明changes仍然可以在after_<type>回调中访问。

我只是在浏览Vestal Versions代码之后才解决这个问题,看看他们是如何做到的。

捂脸。

我接受了卡尔的回答,因为这是一个非常完整的答案。

相关问题