1
0

More than 3 years have passed since last update.

RailsにおけるModelの関連付け

Posted at

概要

モデル間の関連付けは、アプリケーションを作る上で基本中の基本になると思うので、復習の意味を込めてまとめてみます。

関連付けとは

モデル間の関連付けとは、データベースのテーブル間を外部キーを使用し関連付けることです。
これを行うことで、必要なデータを簡単な記述で呼び出したり、データを削除する際、関連したデータを同時に削除できたり非常に便利です。

一対多の関連付け

関連付けの中で代表的なのは、一対多の関連付けだと思われます。
一対多の関連付けとは、あるテーブルの一つのレコードが別のテーブルの複数のレコードと関連付くことです。
例:UserモデルとPostモデルを関連付ける

app/models/user.rb
class User < ApplocationRecord
  has_many :posts
end
app/models/user.rb
class User < ApplocationRecord
  belongs_to :user
end

has_manyメソッドを使用すると「〜をたくさん持っている」、belongs_toメソッドを使うと「〜に属している」という意味になり、二つのモデルが関連付けます。
上記の場合、「UserはPostをたくさん持っている」のような意味合いになります。

これらのメソッドには命名規約があり、has_manyメソッドではモデル名は複数形とし、belongs_toメソッドではモデル名は単数形を使います。
また外部キーのカラム名は参照先モデル名(単数形)+_idと指定します。(例:user_id)外部キーを指定する場合は、オプションでforeign_keyを指定します

app/models/user.rb
class User < ApplocationRecord
  has_many posts, foreign_key: "client_id"
end

メソッド名を変える場合はclass_nameオプションを指定します。has_manyの後ろは新たなメソッド名に変更し、class_nameに本来のモデル名を指定します。

app/models/user.rb
class User < ApplocationRecord
  has_many tweets, class_name: "Post"
end

has_manyにdependentオプションを指定し:destroyと指定すると、参照先レコードが削除された際、参照元のレコードも自動で削除します。

app/models/user.rb
class User < ApplocationRecord
  has_many posts, dependent: :destroy

関連付けによってできること

モデルが関連付くと以下の記述で参照元のデータを取り出せます。

example
@posts = @user.posts

has_manyにて使えるようになったメソッドは集計メソッドやクエリーメソッドを使うことができます。

example
@posts = @user.posts.count
@posts = @user.posts.order("")

参照先へ関連付けるデータを設定する場合、buildメソッドを使用して関連づけることができます。また、引数にモデルの属性を指定できます。

example
@user.posts.build(name: "taro")

<<と記載すると、レコードの保存まで行うことができます。

example
@user.posts << @post

まとめ

モデル間の関連付けに関して復習の意味も込めて、再確認できました。
まだまだ基本的な部分であり、一対一だったり、多対多の関連付けなどもあるので、別の機会にまとめていきたいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0