有没有办法确保在 ActiveRecord 中的所有其他 before_save 回调之后执行给定的 before_save 回调,而不是在代码中实际对它们进行排序?
我正在编写一个包含一些 before_save 功能的外部库,但为了有效,它确实需要在所有其他功能之后调用。我可以绕过它,但它涉及放弃我真的不想放弃的肮脏属性!
- 编辑 -
我没有意识到在保存模型后会保留脏属性。所以 @page.attribute_wasyield
在around_save
.
有没有办法确保在 ActiveRecord 中的所有其他 before_save 回调之后执行给定的 before_save 回调,而不是在代码中实际对它们进行排序?
我正在编写一个包含一些 before_save 功能的外部库,但为了有效,它确实需要在所有其他功能之后调用。我可以绕过它,但它涉及放弃我真的不想放弃的肮脏属性!
- 编辑 -
我没有意识到在保存模型后会保留脏属性。所以 @page.attribute_wasyield
在around_save
.
您可以将要执行的回调设为最后一个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 版本的代码后才解决了这个问题,看看他们是如何做到的。
掌心。
我接受卡尔的回答,因为它是对相当糟糕的问题的一个非常完整的回答。