回调概述
在 Rails 应用正常运作期间,对象可以被创建、更新或删除。Active Record 为对象的生命周期提供了钩子,使我们可以控制应用及其数据。
回调使我们可以在对象状态更改之前或之后触发逻辑。
回调是在对象生命周期的某些时刻被调用的方法。通过回调,我们可以编写在创建、保存、更新、删除、验证或从数据库中加载 Active Record 对象时执行的代码。
回调在使用之前需要注册。我们可以先把回调定义为普通方法,然后使用宏式类方法把这些普通方法注册为回调:
可用的回调
下面按照回调在 Rails 应用正常运作期间被调用的顺序,列出所有可用的 Active Record 回调。
创建对象
更新对象
删除对象
after_initialize 和 after_find 回调
当 Active Record 对象被实例化时,不管是通过直接使用 new 方法还是从数据库加载记录,都会调用 after_initialize 回调。使用这个回调可以避免直接覆盖 Active Record 的 initialize 方法。
当 Active Record 从数据库中加载记录时,会调用 after_find 回调。如果同时定义了 after_initialize 和 after_find 回调,会先调用 after_find 回调。
after_initialize 和 after_find 回调没有对应的 before_* 回调,这两个回调的注册方式和其他 Active Record 回调一样。
调用回调
下面这些方法会触发回调:
下面这些查找方法会触发 after_find 回调:
每次初始化类的新对象时都会触发 after_initialize 回调。
和验证一样,我们可以跳过回调。使用下面这些方法可以跳过回调:慎重地使用这些方法,因为有些回调包含了重要的业务规则和应用逻辑,在不了解潜在影响的情况下就跳过回调,可能导致无效数据。