有没有办法确保给定的before_save回调在 ActiveRecord 中的所有其他before_save回调之后执行,而不是在代码中实际排序它们?
我正在编写一个包含一些before_save功能的外部库,但为了有效,确实需要在所有其他功能之后调用它。我可以绕过它,但它涉及放弃我真的不想放弃的肮脏属性!
--编辑--
我没有意识到在保存模型后会保留脏属性。所以@page.attribute_was在around_save
yield
后仍然会工作。
你可以使你想要执行的回调最后成为around_save
回调。查看可用回调的列表,看看是否可以简单地对某些回调使用不同的回调"桶",以确保它们按所需的顺序执行。
如果您仍然以多个before_save
回调结束并且需要一个回调来最后触发,您可能需要创建自定义回调,例如 define_model_callbacks :split_save
,将常规before_save
回调注册为before_split_save
回调,您希望最后执行的回调作为after_split_save
回调,然后只有一个运行这两组回调的before_save
回调(run_callbacks :split_save
)。有关如何执行此操作的更多信息,请参阅ActiveModel::Callbacks
。
这是通过使用有序before_<type>
回调而不是after_<type>
回调来避免放弃脏属性,因为脏属性changes
在保存后被擦除。
然而,事实证明,changes
仍然可以在after_<type>
回调中访问。
我只是在浏览了 Vestal Versions 代码以查看他们是如何做到的之后才解决这个问题。
脸掌。
我接受卡尔的回答,因为它是对这个相当糟糕的问题的一个非常完整的答案。