rails callback介绍

什么是Callback
在增删改查的操作上添加的回调事件,在执行增删改查的时候同步触发一些逻辑

回调触发分类
creating an object
updating an object
destroying an object
finding an object

Create回调
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback

在回调之前执行
.before_validation
.before_save
.before_create
.before_update
class User < ActiveRecord::Base

	before_save do
		self.username = self.username.downcase
	end

	# or 
	before_save :update_username
	private	
	def update_username
		self.username = self.username.downcase
	end
end

.before_save vs .after_save对比
class User < ActiveRecord::Base

	before_save do
		self.username = self.username.downcase
	end

	# or
	after_save do
		self.username = self.username.downcase
		self.save # update_column
	end

end
上面的after_save有问题吗?
你会发现上面的save之后再调用after_save这样会造成无限死循环
看起来效果是一样,尽量不要在save之后去操作,可以在save之前去操作

Update回调
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback

Destroy回调
before_destroy
around_destroy
after_destroy
after_commit/after_rollback

Find回调
after_find
after_initialize

触发callback的方法
create
create!
decrement!
destroy
destroy!
destroy_all
increment!
save
save!
save(validate: false)
toggle!
update_attribute
update
update!
valid?

触发after_find的方法
all
first
find
find_by
find_by_*
find_by_*!
find_by_sql
last

跳过callback的触发方法(尽量不要使用这些方法吧,防止团队有需要回调)
decrement
decrement_counter
delete
delete_all
increment
increment_counter
toggle
touch
update_column
update_columns
update_all
update_counters

Callback参数
class User < ActiveRecord::Base

before_save :update_username, unless: proc { |user| user.evil? }

# or
before_save :update_username, if: proc { |user| !user.evil? }
end

Transaction
所有的回调都被自动放在了事务中

返回值
如果一个before_* callback的返回值为false那么当前事务就会回滚





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值