やさしい図解で学ぶ　モデル　マイグレーション その2 

## ⭐️モデルについて
モデルファイルとは
**DBとのデータのやりとりをするために重要なファイル**とイメージしてください。

**<font color="red";>モデル(テーブル)間の関係性**を明示したり、
**<font color="red";>DBにあるテーブルに直接データの保存、呼び出しを可能にする**機能を備えています。


<img width="813" alt="スクリーンショット 2019-11-27 18.11.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/650fba3d-151a-7279-94b5-dd30b99a7af5.png">

上の図では
モデルからDBへ「**<font color="red";>ActiveRecord**」と書かれたパイプや橋のようなものがあり、userやtweetモデルからDB内の同じ名前のテーブルに伸びています。

*ActiveRecordというのはRailsに標準ライブラリとして採用されているO/Rマッパーのことです。

専門用語を使わず簡単に表現すると

### DBとアプリケーションとの 「　橋渡し 　or 　通訳　」
のようなものだと思ってください。

もし、モデルがないと

<img width="795" alt="スクリーンショット 2019-11-28 12.06.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/c7f71dcf-d704-6bdc-6e86-9d092cb91ff1.png">

Railsではプログラミング言語「**<font color="red";>Ruby**」を。
DBでは「**<font color="blue";>SQL**」をそれぞれ使っているので、言語の違いからそのままではやりとりができません。

そこで通訳となるモデル(ActiveRecord)の登場です。
<img width="443" alt="スクリーンショット 2019-12-03 12.17.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/c4d5867f-30e4-0bb6-4c22-b9518d219aea.png">



<img width="785" alt="スクリーンショット 2019-11-28 12.44.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/e102b1cd-13aa-361b-cea2-4b4fceded73d.png">

Railsではモデルファイル(ActiveRecord)が通訳のようにRuby→SQLに、SQL→Rubyにと自動的に言語を変換してデータベースとのやりとりを円滑に行ってくれているんです。

特に難しい操作せず、whereやfindなどのメソッドを直感的に使ってデータを出し入れできるのもこの通訳さんのおかげです。

## ⭐️アソシエーション(テーブル間の関連性)

アソシエーションとは、つまり
**テーブル同士の関連性**のことで、テーブル間にみられる対1や対多などの関係性を**<font color="magenta";>モデルファイル**に明示しなければいけません。


例えば下のER図の場合
<img width="408" alt="スクリーンショット 2019-11-19 15.42.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/64d82d55-0c2f-57d1-1c0b-dd136f840c4d.png">

中間テーブルを含む3つのテーブルがあります。
これらの関係性を各テーブルのモデルファイルに記述していきます。

今回の記述方法は以下の3パターンを使用します。
(そのほかにもhas_oneやhas_and_belongs_to_manyなどがあり、オプションも存在しますが今回はこちらの３つのみ)

<img width="456" alt="スクリーンショット 2019-11-25 12.22.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/f2814e20-bf8c-3ac0-ab6b-998f435b5d93.png">

記述方法は
<img width="891" alt="スクリーンショット 2019-11-29 11.15.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/20b84f27-6535-c153-96aa-44d12596b341.png">

belongs_toやhas_oneの場合は単数、
has_manyなどは複数形で記述します。


実際にuserのモデルファイルに記述するとこのようになります。
<img width="439" alt="スクリーンショット 2019-11-27 18.34.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/51fcfafe-1283-a657-1cab-ffa4eb12deda.png">


またそのほかのモデルファイルにもアソシエーションを記述し、
さらにER図のようにイメージして書くとこのような関係性になります。

<img width="499" alt="スクリーンショット 2019-11-25 11.53.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/3432d52c-48ed-9cb6-a512-33e81d176006.png">

中間テーブルcourse_usersにはそれぞれ接続されているテーブルの主キー、つまりは、外部キー**<font color="blue";>user_id**と**<font color="gold";>course_id**を持っていますのでこのような記述となります。


##has_many through
中間テーブルと接続しているテーブルのモデルにはそれぞれアソシエーションとして以下のように記述します。
<img width="624" alt="スクリーンショット 2019-11-29 13.42.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/52960a95-6b6c-3363-55ad-3bbba08542f4.png">

中間テーブルを通ってその先のインスタンスを複数持っていますよという記述になります。

今回も基礎的な部分を図解を用いて記載致しましたので実際の開発ではモデルファイルにもう少し細かく書いていきます。

今回の記事でモデルに関して少しでもイメージが湧いていただけたのなら幸いです。



### ⭐️補足:belongs_to
belongs_toというのがちょっとわかりづらいと思いますが、考え方としては**テーブル内に外部キーを持っているモデルファイルには<font color="blue";>belongs_to**を書くと思ってください。has_oneの場合は外部キーを持っていません。

例えば、
usesテーブルとtweetsテーブルなるものがあり、関係性が図のようだとすると

<img width="650" alt="スクリーンショット 2019-11-29 12.16.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513524/5229c791-5f1a-d69a-10a1-ad67a72416f8.png">

tweetsテーブルには**<font color="magenta";>外部キーであるuser_id**を持っているのでusersテーブルと親→子のような関係であるため、belongs_toをモデルファイルに記述しておく。