Ruby on Rails - Active Record 对象生命周期中的after_initialize和after_find回调顺序?



来自 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_initializeafter_find放在哪里?我认为after_initialize应该放在before_validation之前,after_find不属于其中任何三个。我说的对吗?谢谢。

after_initializeafter_find 回调是两个特殊的回调。

定义after_findafter_initialize事件的回调的唯一方法是将它们定义为 methods 。如果您尝试将它们声明为 handlers ,它们将被默默忽略。

从 API

after_findafter_initialize为每个触发回调 由查找器找到并实例化的对象,具有 after_initialize在新对象实例化后触发 也。

从指南

每当活动时将调用after_initialize回调 记录对象通过直接使用 new 或当 从数据库加载记录。避免需要很有用 以直接覆盖活动记录初始化方法。

每当加载活动记录时,都会调用after_find回调 数据库中的记录。 之前调用after_find after_initialize是否同时定义了两者。

after_initializeafter_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_initializeafter_find放在AR对象生命周期中的什么位置?

由于它们与所有其他回调不同,而且它们没有before_*对应项,因此作者(在此处参考指南作者(可能有兴趣将它们分开放置,因为它们是特殊情况。

最后,我同意将after_initialize放在before_validation之前.可能是这样。

相关内容

  • 没有找到相关文章

最新更新