#Rails Association (関連付け)とは
モデル同士に関係性を持たせる事。モデル同士を関連付けすることで、
関連付けられたモデルから変数を呼び出す事ができ、コードをシンプルに、簡単にできる。
例えば、ユーザ(User)と投稿(Post)というモデルがある場合に、PostはUserがいないと作成されないため、この2つには切り離せない関係性がある時など。
##1対多 (belongs_to と has_many)
1対多の関連性がある場合、関連付けたいモデルに、belogs_to または has_manyを加える。
下記のUser(ユーザー)とPost(投稿)では、ユーザーは複数の投稿を持つ事ができる(has_many)。投稿は特定のユーザーに属している(belongs_to)。
class User < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
belongs_to :user
end
###has_manyの例
ユーザーに関連付けている投稿(つまりユーザーが投稿したもの)をすべて取得しようとすると↓
class User < ApplicationRecord
def posts
return Post.where(user_id: self.id)
end
end
class User < ApplicationRecord
has_many :posts
end
###belongs_toの例
投稿に関連付けているユーザー(つまり投稿したユーザー)を取得しようとすると↓
class Post < ApplicationRecord
def user
return User.find_by(id: self.user_id)
end
end
class Post < ApplicationRecord
belongs_to :user
end
このように「あり」の方が「なし」より、シンプルで分かりやすくなる
##1対1(belongs_to と has_one)
1対1の関連性がある場合、関連付けたいモデルに、belogs_to または has_oneを加える。
例えばあるシステムでは1人のUserは1つのAccount しか持てない決まりだった場合、
ユーザーは1つのアカウントを持っている(has_one)、アカウントは特定のユーザーに属している(belongs_to)という関連付けができる。
###belongs_toとhas_oneのどちらを選ぶか?
2つのモデル(UserとAccount)の間に1対1の関係を作りたいのであれば、いずれか一方のモデルにbelongs_toを追加し、もう一方のモデルにhas_oneを追加する必要がある。どちらの関連付けをどちらのモデルに置けばいいか迷った場合、「ユーザーがアカウントを持っている」とみなす方が、「アカウントがユーザーを持っている」と考えるよりも自然。つまり、この場合の正しい関係は以下のようになる。
class User < ApplicationRecord
has_one :account
end
class Account
belongs_to :user
end