LoginSignup
3
1

More than 3 years have passed since last update.

アソシエーション(1対多)!!

Last updated at Posted at 2020-10-08

アソシエーションって何??:information_desk_person_tone1:

簡単に説明するとモデルを利用したテーブル同士の関連付けのことですね。
テーブル同士で関連付けておき、一方のモデルからもう一方のモデルに
アクセスできるようにするためということですね。

*今回は、「1対多」のアソシエーションの説明になります。
アソシエーションには、「多対多」・「1対1」もありますのでそれは
別の機会でご紹介します。

関連付けを行う理由

Railsでは、「関連付け(アソシエーション: association)」とは2つの
Active Recordモデル同士の繋がりのことですね。

2つモデルの間には関連付けを行なう必要がありますが、
その理由を知っていますか?

それはですね、関連付けを行う事でコードの共通操作をより
シンプルで簡単にできるからなんです。

言葉で説明されてもわからないと思いますのでイメージしやすいように
アソシエーションはこういうことだよって言う画像を下記に載せておきますね。

例:アソシエーション(1対多)

アソシエーション.png

上記の例は、皆さんがよくお使いになられているSNS等をイメージして
もらえるとわかりやすいのではないでしょうか。
「Aさん」が自分だとするならば「投稿1」・「投稿4」は自分が投稿した物
ということになりますね。
これだとイメージがしやすいのではないでしょうか!?笑

次は、実際にどうやって記述するかを説明していきます。

アソシエーション定義の際に使用するメソッド

記述する時に使用するメソッドを紹介していきます。

has_manyメソッド

Userモデルの視点で考えると、あるユーザーの作成した投稿は複数個ある状態です。
つまり、1人のユーザーは複数の投稿を所有しています。

先ほどの画像を見ていただくと「Aさん」は「投稿1」・「投稿4」を
複数個所有している状態ですよねということになりますね。

この状態のことをhas manyの関係といい、
今回の場合は「User has many Tweets」の状態であると言えます。

      「User has many Tweets」
    (Aさん has many 投稿1・投稿4)

この関連付けをするため、userと他のモデルとの間に「1対多」のつながりがあることを示すのがhas_manyメソッドです。

下記の画像を見ると何を説明されているのかわかりやすいと思います。

has many.png

belongs_toメソッド

1つの投稿は、1人のユーザーが投稿したものです。
つまり1つの投稿を複数人が投稿できないため、投稿は必ず1人のユーザーに所属します。

上記で載せた画像で言うと、「投稿1」は「Aさん」が投稿した物だよね。
つまり、「投稿1」と同じ投稿を「Bさん」とかは投稿できないから
「投稿1」は「Aさん」に所属している状態だよねということです。

この状態のことをbelongs toの関係といい、今回の場合は「Tweet belongs to User」の状態であると言えます。

               「Tweet belongs to User」
              (投稿1 belongs to Aさん) 

Tweetモデルと他のモデル(User)との間に「1対1」のつながりがあることを示すのがbelongs_toメソッドです。

belongs_to.png

今回、記述する上で必要なメソッドは揃いました。
では、実際に記述していきましょう!!

アソシエーションの定義方法

今までの説明を参考にして頂き、あとはイメージしたできたものを
記述していくだけですね!
今回の例、モデル名はUserモデル・Tweetモデルでいきたいと思います。

最初にUser(Aさん)のモデルから例を載せていきます。

models/user.rb
class User < ApplicationRecord

  has_many :tweets
end

書き方としましては、 has_many :モデル名(複数形) になります。
どうして複数形になるかと言いますと、User(Aさん)は所有している
投稿(投稿1・4)が複数個あるためです。

Userモデルへの記述はこれで以上です。

それでは最後に、Tweet(投稿)のモデルの例を載せていきます。

models/tweet.rb

  belongs_to :user
end

書き方としましては、 belong_to :モデル名(単数形) になります。
一つの投稿を所有しているのは、一人のUser(Aさん)のため
単数形になります。

これで、TweetモデルとUserモデル間のアソシエーションができましたね。

まとめ

1.アソシエーションとは、モデルを利用したテーブル同士の関連付けのこと

2.belongs_toメソッドとは、モデルと他のモデルが「1対1」の関連付けの
場合に使用するメソッドで、従属する関連になること

3.has_manyメソッドとは、モデルと他のモデルが「1対多」の関連付けの
場合に使用するメソッドで、所有する関連になること

今回は、「1対多」のアソシエーションについて説明させていただきました。
また、アソシエーションには「1対1」・「多対多」もあるのでそれはまた
別の機会にご説明できればと思います。
わかりにくいかもしれませんが、「1対多」のアソシエーションが
どのようなものかわかって頂けたら嬉しいです。

ありがとうございました!

3
1
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
3
1