来自Rails指南。回调可以挂钩到Active Record Object的生命周期。按照执行顺序,他们(从Rails指南中复制):
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
不属于其中任何三个。我对么?感谢。
答案 0 :(得分:18)
after_initialize
和after_find
回调是两个特殊的回调。
定义after_find
和after_initialize
事件的回调的唯一方法是将它们定义为methods
。如果你尝试将它们声明为handlers
,它们将被默默地忽略。
来自API
每个都会触发
after_find
和after_initialize
回调 由查找程序找到并实例化的对象 在实例化新对象后触发after_initialize
同样。
来自Guides
只要有Active,就会调用
after_initialize
回调 记录对象是通过直接使用new或者a来实例化的 记录从数据库加载。避免这种需要可能很有用 直接覆盖您的Active Record初始化方法。每当Active Record加载时,都会调用
after_find
回调 来自数据库的记录。之前调用after_find
after_initialize
如果两者都已定义。
after_initialize
和after_find
回调没有 before_ * 对应的,但它们可以像其他Active一样注册 记录回调。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_ *对应物,因此作者(在此处引用Guides作者)可能对放置感兴趣它们是分开的,因为它们是特例。
最后我同意将after_initialize
放在before_validation
之前。情况可能就是这样。