【发布时间】:2019-06-22 13:52:44
【问题描述】:
我在 ActiveRecord 中排序回调时遇到了一些问题。根据 Rails guides,创建对象时回调的顺序如下:
- before_validation
- after_validation
- before_save
- around_save
- before_create
- around_create
- after_create
- after_save
- after_commit/after_rollback
我的模型中有两个回调。一个用于 after_save(在创建和更新时运行),第二个用于 after_create。在创建时,我希望仅在 after_save 回调之后运行 after_create 回调。如何在 ActiveRecord 中完成这项工作?谢谢。
【问题讨论】:
-
好吧,你不能重新排序回调。因此,要么将您的逻辑放入
after_save(或更高版本),要么完全放弃使用回调。例如,支持某种 Builder 模式。 -
由于
rails-3到rails-5应用程序升级,我没有看到任何这样做的目的。因此,@SergioTulentsev 建议的更改是有效且可取的。 -
@SergioTulentsev 如何将
after_create逻辑添加到after_save中?after_save也将在更新时运行。 -
@BKS: 顶一下,你可以在
before_create中设置一个标志。像self.record_was_just_created = true这样的东西。然后在after_save中检查这个标志。如果标志为真,则运行特定于创建的部分。我,我会将其提取到单独的构建器/更新对象中。应该使构建过程显而易见。并且可以在需要时避免。 -
@BKS 您可以使用
new_record?检查记录是否为新记录。所以在 after_save 回调检查self.new_record?
标签: ruby-on-rails activerecord