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



有没有办法确保给定的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 代码以查看他们是如何做到的之后才解决这个问题。

脸掌。

我接受卡尔的回答,因为它是对这个相当糟糕的问题的一个非常完整的答案。

相关内容

最新更新