多个 save 方法

在以下几个类或模块里都有 save 方法,那么它到底是如何工作,如何保存数据的呢。

module ActiveRecord
  class Base
    # ... ...
    # 真正的保存 create_or_udpate
    include Persistence

    # ... ...
    # 相关校验 perform_validations
    include Validations

    # ... ...
    # 相关脏数据 Dirty
    include AttributeMethods

    # ... ...
    # 加上事务 rollback_active_record_state! 及 with_transaction_returning_status
    include Transactions

    # ... ...
  end
end

根据 Ruby 的代码执行规则:会"反着"模块的引入顺序,嵌套执行里面的 save 方法。

进入 Transactions 的 save
进入 AttributeMethods 的 save
进入 Validations 的 save
进入 Persistence 的 save

离开 Persistence 的 save
离开 Validations 的 save
离开 AttributeMethods 的 save
离开 Transactions 的 save

同理,当执行其它某个操作的时候,也会发生类似情形。

参考

Life of save in ActiveRecord

最后更新于