fluid_27’s blog

駆け出しエンジニアが頭を整理するために綴るブログ

dependent: :destroy や foreign_keyについての備忘録

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にある値しか格納できなくなる)