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」みたいなものもあったけれど、とりあえずスルーする・・
参考にしたサイト