niki12260714の日記

フリーランスのITエンジニアの呟き。

親子関係にあるテーブルに一度にデータを保存する

親テーブルにデータを作ったら、そのidを使って子テーブルにもデータを入れたい場合がありますよね。
というのをやってくれるのが、buildです。

まず最初に、各モデルに親子関係を記述します。
※Aの子供がB、Bの子供がCとする

Aモデル:
has_many:bs(複数形)

Bモデル:
belongs_to:a(単数形)
has_many:cs(複数形

Cモデル:
belongs_to:b(単数形)

※1:1の場合はhas_one:単数形になることに注意。そしてこの場合、buildではなく、build_xxになる。
参考:http://codenote.net/ruby/rails/1778.html

で、親のインスタンスを作成したら、子供のインスタンスをbuildする。

oya = A.new
child = oya.bs.build
childchild = child.cs.build

※親から見た子供は複数形で記述

※親から孫の生成はできない(例:oya.bs.cs.buildみたいにはできない)

※子供のインスタンスに固定値を入れておきたい場合は引数に記述する
参考:build - リファレンス - - Railsドキュメント

実際にDBに保存する場合は、親だけを保存すれば、一緒に子供のテーブルにも保存してくれるし、親のIDも自動的に取得して入れてくれる。

oya.save