最近railsチュートリアルを完走した22卒エンジニア(男)です。railsのアソシエーションについてです。
railsチュートリアルでhas_many、belongs_toを理解した(つもりだった)のですが実務で全く使いこなせませんでした。で、改めて勉強して初学者が理解しやすいような表現がなんとなく分かった気がしたので記事に残します。
※ 私の表現が間違っていたりすることもあるかもしれませんのでその際はご指摘いただければ幸いです。
対象者
- has_many、belongs_toが既存の記事であまり理解できない。
- 私のようにhas_many、belongs_toを完全に理解した(つもりの)人
has_many、belongs_toの正体
公式リファレンス
まずrailsガイドのhas_many、belongs_toについての記事を引用します。
has_many関連付けは、has_oneと似ていますが、相手のモデルとの「1対多」のつながりを表す点が異なります。has_many関連付けは、多くの場合belongs_toの反対側で使われます。
has_many関連付けは、そのモデルの各インスタンスが、相手のモデルのインスタンスを0個以上持っていることを示します。
あるモデルでbelongs_to関連付けを行なうと、他方のモデルとの間に「1対1」のつながりが設定されます。このとき、宣言を行ったモデルのすべてのインスタンスは、他方のモデルのインスタンスに文字どおり「従属(belongs to)」します。
理解しているひとであればスッと入ってきますが初見の人にはなかなか理解に苦しむかと思います。
自分なりの解釈
前提として記法についての説明をします。そうなんだな程度の理解で大丈夫です。
書き方
has_manyに記載するものは複数形、belongs_toに記載するものは単数系というルールがあります。
ここで指定しているのは、各テーブルのカラムです。parentカラムとchildrenカラムを連携させています。
has_many :childrens
belongs_to :parent
正体
彼らの正体、parentsとchildrenでお察しの方もいるとは思いますが2人は親子です。belongs_toに記載しているchildrenはhas_manyに記載しているparentsの所有物です。(表現汚くてすみません)
「一対多」 と呼ばれるの肝はここで1人の親に対してたくさんの子供がいるイメージです。(親は2人だろ!ってツッコミ待ってます。)
何がいいのか
データ同士の関連付けを行うことで、モデルをシンプルなものにすることができます。(巷では正規化と呼ばれてます)
human1 = Family.find(1) # parentカラムがあるDBのid=1のデータを取得
human2 = human1.children # parentカラムをもつDBから作成オブジェクトから別なDBのchildrenカラムのデータを引っ張ってこれる。
まとめ
has_manyとbelongs_toによるアソシエーションについでした。
実際に使わないと、理解するのは難しいと思います。座学でちゃんと理解できなくてもいいと思います。日が経ってからまた見てみると「こんなもんか」って簡単に理解できたりもします。
この記事はあくまで概要を把握するだけなので正しく網羅的に理解するには公式の解説を見るべきです。
使いこなせれば強力な武器になると思ったので今後も理解を深めていこうと思います。