来自 Rails Guides。回调可以挂钩到活动记录对象的生命周期。按照执行顺序,它们是(从 Rails Guide 复制(:
创建对象
-
before_validation
-
after_validation
-
before_save
-
around_save
-
before_create
-
around_create
-
after_create
-
after_save
-
after_commit/after_rollback
更新对象
-
before_validation
-
after_validation
-
before_save
-
around_save
-
before_update
-
around_update
-
after_update
-
after_save
-
after_commit/after_rollback
销毁对象
-
before_destroy
-
around_destroy
-
after_destroy
-
after_commit/after_rollback
我想知道将after_initialize
和after_find
放在哪里?我认为after_initialize
应该放在before_validation
之前,after_find
不属于其中任何三个。我说的对吗?谢谢。
after_initialize
和 after_find
回调是两个特殊的回调。
定义after_find
和after_initialize
事件的回调的唯一方法是将它们定义为 methods
。如果您尝试将它们声明为 handlers
,它们将被默默忽略。
从 API
after_find
和after_initialize
为每个触发回调 由查找器找到并实例化的对象,具有after_initialize
在新对象实例化后触发 也。
从指南
每当活动时将调用
after_initialize
回调 记录对象通过直接使用 new 或当 从数据库加载记录。避免需要很有用 以直接覆盖活动记录初始化方法。每当加载活动记录时,都会调用
after_find
回调 数据库中的记录。 之前调用after_find
after_initialize
是否同时定义了两者。
after_initialize
和after_find
回调没有before_* 对应方,但它们可以像其他活动一样注册 记录回调。class User < ActiveRecord::Base after_initialize do |user| puts "You have initialized an object!" end after_find do |user| puts "You have found an object!" end end >> User.new You have initialized an object! => #<User id: nil> >> User.first You have found an object! You have initialized an object! => #<User id: 1>
将after_initialize
和after_find
放在AR对象生命周期中的什么位置?
由于它们与所有其他回调不同,而且它们没有before_*对应项,因此作者(在此处参考指南作者(可能有兴趣将它们分开放置,因为它们是特殊情况。
最后,我同意将after_initialize
放在before_validation
之前.可能是这样。