railsでアプリを作っていて、何回かモデル設計する際に「これどういう意味だっけ?」となったので、備忘録としてのまとめ
accepts_nested_attributes_for
親モデルにの方に記述することで、子モデルのテーブルの更新も同時にできるようになる。
例えば、以下のような1人のuserに対して複数のpostが紐づいている多対1のモデルがあったとする。
userクラス
Class User
has_many posts
accepts_nested_attributes_for :posts
end
postクラス
Class Post
belongs_to :user
end
受け取ったパラメータ
params = { user: {
name: "sample",
email: "abcde@example.com",
post_attributes: [
{ title: "初めての投稿"},
{ title: "2回目の投稿"},
]
} }
というパラメータが送られてきた際にuserテーブルだけでなく、userに紐づいているpostテーブルのデータも更新される。
dependent: :destroy
親モデルを削除する際にそれに紐づいている子モデルも同時に削除される。
userクラス
Class User
has_many posts, dependent: :destroy
end
postクラス
Class Post
belongs_to :user
end
とすることで、userを削除したら、そのuserが持つpostも同時に削除される。
references, foreign_key
referencesm forgien_keyを付与することで得られるメリットがいくつかある。
1人のuserが複数postを持つ、多対1のモデルがあったとすると、postテーブルのマイグレーションファイルの方に
references :users, foreign_key : true
を付与することで
- インデックスを自動で貼ってくれる
- userでなくuser_idというカラムを自動で作ってくれる
- 外部キー制約がつく
ちなみに、
外部キー制約とは
親テーブルと子テーブルの整合性を保つ為のもので、子テーブルにデータを追加する際、親テーブルのカラムにあるデータしか格納できなくなる。
(上記の例でいうと、Postテーブルのuser_idというカラムにはUserテーブルのuser.idにある値しか格納できなくなる)