2

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

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

- 编辑 -

我没有意识到在保存模型后会保留脏属性。所以 @page.attribute_wasyieldaround_save.

4

2 回答 2

5

您可以将要执行的回调设为最后一个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如何执行此操作的更多信息,请参阅。

于 2012-05-31T18:34:43.707 回答
1

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

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

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

掌心。

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

于 2012-06-07T12:57:19.977 回答