ActiveRecordへのattributeの代入時に何が起こっているか

ActiveRecordを継承したモデルへのattributeの代入時の挙動について。

通常の attribute

activerecord/attribute_methods/write.rb 内で #{attribute_name}= メソッドを動的に定義している。

その中で @attributes<ActiveRecord::AttributeSet> (ハッシュ的なもの)に対して attribute_nameのキーに値を設定している。

has manyとかの _ids への代入

active_record/associations/builder/collection_association.rb 内で、 #{attribute_name}_ids= メソッドを動的に定義していて、

その中で association(:#{name}).ids_writer(ids) を呼び出している

association ??

関連先のモデル自体ではなく、関連元、関連先、連携の設定の情報をもった、連携用の機能を色々もったオブジェクト(ActiveRecord::Associations::Association)

associationオブジェクトは、関連の種類(belongs_to, has_many ...)によって機能が拡張されている。


ids_writer内の処理では、idsからインスタンスリストを生成して、削除分の差分が delete_all され、追加分の差分が insert される