什么是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那么当前事务就会回滚
rails callback介绍
最新推荐文章于 2024-06-19 22:43:49 发布