文档章节

Active Record回调

ChingHwang
 ChingHwang
发布于 2014/05/27 14:34
字数 810
阅读 42
收藏 0

对象的生命周期

回调可以再对象的状态改变之前或之后触发指定的逻辑操作。

回调简介

回调是在对象生命周期的特定时刻执行的方法。回调方法可以在Active Record对象创建,保存,更新,删除,验证或是从数据库中读出时执行。

注册回调

在使用回调之前,需要先注册。回调方法的定义和普通的方法一样,然后使用类方法注册。

class User < ActiveRecord::Base
  validates :login, :email, presence: true
  
  before_validation :ensure_login_has_a_value

  protected 
    def ensure_login_has_a_value
      if login.nil?
        self.login = email unless email.blank?
      end
    end
end

这种类方法还可以接受一个代码块。如果操作可以使用一行代码表述,可以考虑使用代码块形式:

class User < ActiveRecord::Base
  validates :login, :email, presence: true
   
  before_create do
    self.name = login.capitalize if name.blank?
  end
end

注册回调时可以指定只在对象生命周期的特定事件发生时执行:

class User < ActiveRecord::Base
  before_validation :normalize_name, on: :create

  after_validation: set_location, on: [:create, :update]

  protected
    def normalize_name
      self.name = self.name.downcase.titleize
    end

   def set_location
     self.location = LocationService.query(self)
   end
end

一般情况下,都会把回调方法定义为受保护的或是私有方法。

可用的回调

创建对象

before_validation after_validation
before_save after_save
around_save around_create
before_create after_create

更新对象

before_validation after_validation
before_save after_save
around_save around_update
before_update after_update

销毁对象

before_destroy around_destroy
after_destroy

创建和更新对象都会触发after_save,但不管注册顺序,总在after_create和after_update之后执行。

after_initializeafter_find

after_initialize回调在Active Record对象初始化时执行,包括使用new和从数据库中读取记录。

after_find回调在数据库中读取记录时执行。如果同时注册了after_find和after_initialize回调,after_find会先执行。

after_touch

after_touch回调在碰触Active Record对象时执行。

执行回调 方法触发执行回调

跳过回调 

终止执行

在模型中注册回调后,回调会加入一个执行队列。这个队列中包含模型的数据验证,注册的回调,以及要执行的数据库操作。

整个回调链包含在一个事务中。如果任意一个before_*回调方法返回false或是抛出异常,整个回调链都会终止执行,撤销事务;

而after_*回调只有抛出异常才能达到相同的效果。

关联回调

回调能在模型关联中使用,甚至可有关联定义。

条件回调

条件通过:if和:unless选项指定,选项的值可以是Symbol、字符串、Proc或数组。

if选项指定什么时候调用回调,unless指定什么时候不调用回调。

使用Symbol时,表示要在调用回调之前执行对应的判断方法。

使用字符串时,但必须是Ruby代码,传入eval方法中执行,

使用Proc,这种形式最适合用在同一行代码能表示的条件上

回调类

有时回调方法可以在其他模型中重用,可以将其封装到类中。

事务回调

还有两个回调会在数据库事务完成时触发:after_commit和after_rollback。

© 著作权归作者所有

ChingHwang
粉丝 0
博文 10
码字总数 11194
作品 0
海淀
私信 提问
Active Job 基础

Active Job 基础 脱线道士维克多2017-11-303 阅读 rails 简介 开发中涉及到调用三方服务API,运行时间长,结果不需要实时反馈给用户这样的任务,都可以使用异步处理。常见的场景包括:发邮件...

脱线道士维克多
2017/11/30
0
0
使用 Rails Active Resource 简化 web 应用程序之间的互操作性

当今的应用程序不仅需要和基于浏览器的客户端互操作,还需要和其他应用程序互操作。为实现互操作性,web 应用程序通常提供一个 web 服务 API。web 服务 API 通过一个网络(比如 Internet)提...

IBMdW
2011/06/03
383
0
(四)序列标注——实体识别BERT-BLSTM-CRF(下)

前面说的是ner的经典算法以及今年的一些比较好的工作,最近bert模型刷新了NLP的绝大部分任务,可谓是一夜之间火爆了整个NLP界,这里我简单记录下bert在NER上的使用,至于原理部分我后续的博客...

天生smile
2018/12/05
0
0
mysql 死锁记录

测试环境: mysql 5.7.18 RR隔离级别 创建表,插入部分测试数据 CREATE TABLE yhtest ( a INT (11) NOT NULL AUTO_INCREMENT, b INT (11) DEFAULT NULL, c INT (11) DEFAULT NULL, PRIMARY ......

雪隐千寻
2017/10/27
0
0
音频解码 Audio Converter

需求 iOS中将压缩音频数据(如AAC)进行解码以得到原始音频数据类型:线性PCM. 本例最终实现的是通过Audio Queue采集到AAC压缩数据,将其解码为PCM数据,并将解码后的PCM数据以录制的形式保存在沙...

小东邪啊
05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
963
11
oracle ORA-39700: database must be opened with UPGRADE option

ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-39700: database must be opened with UPGRADE option 进程 ID: 3650 会话 ID: 29......

Tank_shu
今天
3
0
分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
聊聊DubboDefaultPropertiesEnvironmentPostProcessor

序 本文主要研究一下DubboDefaultPropertiesEnvironmentPostProcessor DubboDefaultPropertiesEnvironmentPostProcessor dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/au......

go4it
昨天
2
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部