1
1

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.

アソシエーション(ビギナー)

Last updated at Posted at 2018-09-01

この記事は、「RAILS GUIDES」におけるアソシエーションの内容を自分なりに分かりやすくまとめたものである。

引用部分は全て下記のHPより引用している。
[RAILS GUIDES:Active Record の関連付け (アソシエーション)]
(https://railsguides.jp/association_basics.html)

##アソシエーション

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

何を言っているのかよくわからないが、とりあえず、親子のつながり=アソシエーション(関連付け)と捉えておけば良い。
Active Record=モデル

belongs_to関連付け(子から見た親)

あるモデルでbelongs_to関連付けを行なうと、他方のモデルとの間に「1対1」のつながりが設定されます。このとき、宣言を行ったモデルのすべてのインスタンスは、他方のモデルのインスタンスに「従属(belongs to)」します。

例えば、山田太郎さんが自分の子供を産んだ時に、その子供は自動的に山田という苗字が付与され、子供は一族のグループへと加わる(従属)することとなる。このように、「1対1」のつながりとは、物体Aが持つ情報の一つと、と物体Bが持つ情報の一つがつながることを言う。

その時、従属させるための記述がbelongs_toとなる。これを子供のクラスへと記述することで、子供のマイグレーションファイルにはt.belongs_to :○○と記述される。

マイグレーションファイルにt.belongs_to :○○と記述されることにより、そのテーブルのカラムには○○_idのカラムが設定され、このカラムに関連付けのデータ(苗字)が保存されることとなる。

子供が生まれた瞬間インスタンスが生成された瞬間から、そのインスタンスのidは主キーのidと連携し、いつでも呼び出される状態にあるのだ。

##主キーと外部キー

(belongs_to)と宣言すると、2つのモデルのそれぞれのインスタンス間で「主キー - 外部キー」情報を保持しておくようにRailsに指示が伝わります。また、それに伴って幾つかの役立つメソッドもそのモデルに追加されます。

2つのモデルを関連づけるには、当たり前だが関連づけるための目印が必要となる。秘密基地に手ぶらで言っても通して貰えるわけがないように、「私はあなたの仲間である」と言うことを証明する必要がある。

このように、お互いが仲間であることを証明する役割を果たすもの、つまり、2つのテーブルを関連付けるための新たなフィールドを、「キー(主キーまたは外部キー)」と呼ぶ。

主キーとは、ボスが持っているもので、外部キーは子分が持っているものと考えれば良い。

has_many関連付け(親から見た子)

子が親に属するために(belongs_to)を使うのに対し、親は自分が親であると宣言する必要がある。その宣言がhas_manyである。生みの親(母親)1人に対して複数の子供がいるような関係を「1対多」の関係と言う。

通常、テーブルには自動的にidカラムが付与される。このアソシエーションでは、
そのidを用いて、関連性をもたせたいテーブルのマイグレーションファイルに
't.belongs_to'やhasmanyとする。

そうすることで、カラムに「○○_id」とカラムが追加され、
元となるテーブルのidと連動するようになる。

マイグレーションファイルにて、

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?