親子関係のモデルの取り扱い
親子関係のモデルの取り扱いで、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でまとめて操作する方針にするのがよさそうです。