循環参照してるときのsaveにおけるActive Recordの挙動

class A < ApplicationRecord
  belongs_to :b
end

class B < ApplicationRecord
  belongs_to :a
end

a = A.new
b = B.new
a.b = b
b.a = a
a.save

みたいなときどのように動くのかを調べた。

↓このへんを参考にした

rails/autosave_association.rb at master · rails/rails

  • belongs_to関連を設定した場合、before_saveでsave_belongs_to_associationが実行される
  • a.saveしたときに、save_belongs_to_association経由で関連先bのsaveを実行する
  • bのbefore_saveでもsave_belongs_to_associationが実行され、先にaが保存される(このときaのsave_belongs_to_associationの二回目が実行されないような仕組みが入っている rails/autosave_association.rb at master · rails/rails )。
  • bにaの外部キーが設定されてbが保存される
  • aにbの外部キーが設定され、aが再度保存(update)される

という流れになるはず。