yo-log

@yo-iidaのlog

親子関係のモデルの取り扱い

親子関係のモデルの取り扱いで、has_manyとhas_oneで初期化の方法が違うことを知らずに詰まりました。

Userモデルとそれに紐づくAddressモデルがOne-to-One、PurchaseモデルがOne-to-Manyだとします。

このとき、モデルの定義は、簡易的に、

class User < ActiveRecord::Base
  has_one :address
  has_many :purchases
end
class Address < ActiveRecord::Base
  belongs_to :user
end
class Purchase < ActiveRecord::Base
  belongs_to :user
end

とかけます。 これらをコントローラ側で初期化する際には、下記のようになります。 (パラメータ渡したりなどは省略)

@user = User.new
@address = @user.build_address
@purchases = @user.purchases.build

最初初期化について、全部buildすりゃいいんだろと思っていたら、has_oneで怒られてなんでやねんってかなり悩んでいた。。

buildの書き方が違うんですね。

また、このような親子関係のモデルをビューでフォームとして扱いたい場合は、モデルの定義のほうにそれぞれaccepts_nested_attributes_for を追加して親から子のモデルを扱えるようにして、fields_forでまとめて操作する方針にするのがよさそうです。