#概要
モデル間の関連付けは、アプリケーションを作る上で基本中の基本になると思うので、復習の意味を込めてまとめてみます。
#関連付けとは
モデル間の関連付けとは、データベースのテーブル間を外部キーを使用し関連付けることです。
これを行うことで、必要なデータを簡単な記述で呼び出したり、データを削除する際、関連したデータを同時に削除できたり非常に便利です。
#一対多の関連付け
関連付けの中で代表的なのは、一対多の関連付けだと思われます。
一対多の関連付けとは、あるテーブルの一つのレコードが別のテーブルの複数のレコードと関連付くことです。
例:UserモデルとPostモデルを関連付ける
class User < ApplocationRecord
has_many :posts
end
class User < ApplocationRecord
belongs_to :user
end
has_manyメソッドを使用すると「〜をたくさん持っている」、belongs_toメソッドを使うと「〜に属している」という意味になり、二つのモデルが関連付けます。
上記の場合、「UserはPostをたくさん持っている」のような意味合いになります。
これらのメソッドには命名規約があり、has_manyメソッドではモデル名は複数形とし、belongs_toメソッドではモデル名は単数形を使います。
また外部キーのカラム名は参照先モデル名(単数形)+_idと指定します。(例:user_id)外部キーを指定する場合は、オプションでforeign_keyを指定します
class User < ApplocationRecord
has_many posts, foreign_key: "client_id"
end
メソッド名を変える場合はclass_nameオプションを指定します。has_manyの後ろは新たなメソッド名に変更し、class_nameに本来のモデル名を指定します。
class User < ApplocationRecord
has_many tweets, class_name: "Post"
end
has_manyにdependentオプションを指定し:destroyと指定すると、参照先レコードが削除された際、参照元のレコードも自動で削除します。
class User < ApplocationRecord
has_many posts, dependent: :destroy
#関連付けによってできること
モデルが関連付くと以下の記述で参照元のデータを取り出せます。
@posts = @user.posts
has_manyにて使えるようになったメソッドは集計メソッドやクエリーメソッドを使うことができます。
@posts = @user.posts.count
@posts = @user.posts.order("")
参照先へ関連付けるデータを設定する場合、buildメソッドを使用して関連づけることができます。また、引数にモデルの属性を指定できます。
@user.posts.build(name: "taro")
<<と記載すると、レコードの保存まで行うことができます。
@user.posts << @post
#まとめ
モデル間の関連付けに関して復習の意味も込めて、再確認できました。
まだまだ基本的な部分であり、一対一だったり、多対多の関連付けなどもあるので、別の機会にまとめていきたいです。