belong_to
この関連付けをされているクラスには外部キーがあること前提
外部キーが別クラスにある場合はhas_oneを使用する必要がある
:optional
belong_toで使えるオプションの一つ
公式
:optionalオプションをtrueに設定すると、
関連付けされたオブジェクトの存在性のバリデーションが実行されないようになる。
☆値が空で来たときはエラーを返さずに、その空情報をなかったかのように振る舞わせることができる
☆optional: trueはpresence:trueと逆のことをしている
☆外部キーのnilを許容してくれる
☆アソシエーション組んである状態のため親要素がないとエラー!って出てしまうモデルのチェックを回避してくれる
今回は親の情報が入った時点で子要素側に親_idの情報が渡すことができるようになる
そのため親が存在していないと子は保存できない状態にあるということ
いつ親の要素が入るのか
親と子の要素が一緒に登録されるからことここの記述が必要になるという特殊な状態
一旦子要素が親要素がない状態でも作られるようにしていて
親要素ができたタイミングで子要素を紐付けをさせるようにしている
reject_if: :all_blank
accepts_nested_attributes_forをすると空の文字列が入っているデータを弾いてくれる
allow_destroy: true
モデル経由から別モデルを削除する時に必要なオプション
親要素側から削除する必要がある
※今回はネストさせて使用するデータベース = controllerがない = destroyアクションがないという状態
コントローラがない特殊なモデルaccepts_nested_attributes_forの関係の時どう削除するか
自分に紐づいているコントローラを持たないモデルのデータを消したいときに使う
dependent: :destroy
親要素がいなくなってしまったときに子要素が浮いた状態にならないように削除される
belongs_toとhas_oneのどちらを選ぶか
2つのモデルの間に1対1の関係を作りたいのであれば、いずれか一方のモデルにbelongs_toを追加し、もう一方のモデルにhas_oneを追加する必要があります。
外部キー(foreign key)をどちらに置くかできまる