53
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails Association 1対多,1対1について。

Posted at

#Rails Association (関連付け)とは
モデル同士に関係性を持たせる事。モデル同士を関連付けすることで、
関連付けられたモデルから変数を呼び出す事ができ、コードをシンプルに、簡単にできる。
例えば、ユーザ(User)と投稿(Post)というモデルがある場合に、PostはUserがいないと作成されないため、この2つには切り離せない関係性がある時など。
##1対多 (belongs_to と has_many)
1対多の関連性がある場合、関連付けたいモデルに、belogs_to または has_manyを加える。
下記のUser(ユーザー)とPost(投稿)では、ユーザーは複数の投稿を持つ事ができる(has_many)。投稿は特定のユーザーに属している(belongs_to)。

UserモデルとPostモデル
class User < ApplicationRecord
    has_many :posts
end

class Post < ApplicationRecord
    belongs_to :user
end

###has_manyの例
ユーザーに関連付けている投稿(つまりユーザーが投稿したもの)をすべて取得しようとすると↓

Association「なし」
class User < ApplicationRecord
  def posts
    return Post.where(user_id: self.id)
  end
end
Association「あり」
class User < ApplicationRecord
  has_many :posts
end

###belongs_toの例
投稿に関連付けているユーザー(つまり投稿したユーザー)を取得しようとすると↓

Association「なし」
class Post < ApplicationRecord
  def user
    return User.find_by(id: self.user_id)
  end
end
Association「あり」
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を追加する必要がある。どちらの関連付けをどちらのモデルに置けばいいか迷った場合、「ユーザーがアカウントを持っている」とみなす方が、「アカウントがユーザーを持っている」と考えるよりも自然。つまり、この場合の正しい関係は以下のようになる。

UserモデルとAccountモデル
class User < ApplicationRecord
  has_one :account
end

class Account 
  belongs_to :user
end
53
48
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
53
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?