有没有办法确保在ActiveRecord中的所有其他before_save回调之后执行给定的before_save回调,而不是在代码中实际排序它们?
我正在编写一个包含一些before_save功能的外部库,但为了有效,它确实需要在所有其他功能之后调用。我可以解决它,但它涉及放弃我真正不想要的脏属性!
- 编辑 -
我没有意识到在保存模型后维护了脏属性。因此@ page.attribute_was仍然可以在yield
中的around_save
之后使用。
答案 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代码之后才解决这个问题,看看他们是如何做到的。
捂脸。
我接受了卡尔的回答,因为这是一个非常完整的答案。