Rails Diary

プログラミングの学習記録です。

RUNTEQ(10)has_many「テーブルの結合」

「has_many」ってなんだ?

「has_many」

一対多で関係するモデルをhas_manyというキーワードで表す。

class Animal < ApplicationRecord

 has_many :cats

end

 

has_manyが何のことか分からない問題🤔

 

「アソシエーション」「一対多」そんなイメージがぼんやりと浮かぶ。現場Railsでは、ほとんど割愛されてコラムでちらっと紹介されているくらい。

Rails入門②のテーブルを結合させる課題で少し出てきたきり、よく分かっていないまま進めてしまったので、調べてみることにしました。

 

・has_manyはテーブル同士を関連づけるためにある

・関連付け(アソシエーション)

テーブル同士が関係にあることを明示的に表現すること。

 

一対多

ツイッターのユーザー田中さん(一人)

田中さんの複数のツイート(複数)

 

ツイート一つ一つに田中さんのuser_idが含まれており、ユーザーとユーザーのツイートが関連付られている。

 

参照先テーブル

田中さん(usersテーブル)

関連において主キー(id)を持つテーブル

 

参照元テーブル

各ツイート(tweetsテーブル)

外部キー(user_id)を持つテーブル

 

参照先とか参照元という言い回しが微妙に分かりづらい感じがする☹︎

参照元(ツイート)が外部キーを使って参照先(ユーザー)を参照している

 

belongs_to

参照元から参照先の情報にアクセスするアソシエーション

ツイートからユーザーにアクセス

 

class Tweet < ApplicationRecord

 belongs_to :user

end

 

こう書くことでツイートはユーザーから値を参照できる

belong_to

このユーザーに所属しているツイートだよってことか!💡

 

has_many

belong_toではツイートからユーザーにアクセスした

has_manyでツイートとの関係を書くことで、双方向で関係を定義する

 

class User < ApplicationRecord

 has_many :tweets

end

 

合っているか分からないけど、文字のまま読むと、たくさんのツイートを抱えているみたいなニュアンスなのかなと思った。

 

感想

他にも一対一の「has_one」「has_many through」みたいなものもあったけれど、とりあえずスルーする・・

 

 

 

参考にしたサイト

qiita.com