因ActiveRecord方法弃用,Mongoid是否支持saved_change_to_attribute等方法?
Mongoid对
saved_change_to_attribute?和attribute_before_last_save的支持情况 刚好对这块比较熟悉,来给你明确说下:Mongoid 完全支持你提到的这两个方法,刚好能替代ActiveRecord里即将在after_(create|update|save)回调中弃用的attribute_changed?和attribute_was,完美保持技术栈的一致性!
1. saved_change_to_attribute?:检查属性是否在上次保存时变更
这个方法的用法和ActiveRecord同名方法几乎完全一致,用来判断指定属性在上一次save/create/update操作中是否发生了值的变化:
- 基础判断示例:
class Article include Mongoid::Document field :status, type: String, default: "draft" after_save :handle_status_change def handle_status_change if saved_change_to_attribute?(:status) puts "文章状态在上次保存时被修改了!" # 如果需要获取具体的变更前后值,调用不带问号的版本: old_status, new_status = saved_change_to_attribute(:status) puts "从 #{old_status} 改成了 #{new_status}" end end end
2. attribute_before_last_save:获取属性上次保存前的值
这个方法对应ActiveRecord的同名方法,可以直接拿到指定属性在上一次保存操作之前的旧值,不管是创建还是更新场景都能正常使用:
- 使用示例:
class Product include Mongoid::Document field :price, type: Float after_update :log_price_change def log_price_change old_price = price_before_last_save puts "商品价格更新前是 #{old_price} 元,现在是 #{price} 元" end end
在after_create回调中调用时,它会返回属性的初始值(也就是创建时设置的原始值)。
额外提一句:Mongoid在回调相关的API设计上,一直刻意和ActiveRecord对齐,所以你可以直接照搬ActiveRecord的使用习惯,几乎不需要额外的适配工作。
内容的提问来源于stack exchange,提问作者rjurado01
相关产品推荐
相关产品推荐

