rails db 異なるdb間の紐付け

異なるデータを必要とする理由

管理するデータの性質上、dbを分ける必要がある。

a 各データの利用方法がそもそも異なる場合

b 各データが1対1の関係ではなく、1対複数の関係の場合例)userモデルには、各従業員の個人データを格納、attendanceモデルには、各従業員の勤務実績を格納する。この場合は、一従業員に対して複数の勤務データが存在することになるので、一つのdbで実現するのは困難である。

今回はbについて復習

1.attendanceモデル作成時に行う事

1)userモデルに格納されている各々の従業員と勤務実績を紐付けする為、attendanceモデルにもuser_idを設定し、userモデルに格納されているカラムuser_idと連結する。

2)model作成コマンド入力時:userモデルとの関係性を追加する為、user:references を追加 

コマンド 「rails g model モデル名 カラム名:型 カラム名:型 ….. user:references」

実際には、user_id をカラムに追加指定しなくても、「user:references」追記により、自動的にuser_id属性が追加される

2.model作成後

1)attendance.rbには「belong_to :user」が記載されており、userが親、attendanceが子という関係性(1対1)を意味している。

これに対し、userモデルとattendanceモデルの関係性は1対複数にしたいので、user.rbに
「has_many :attendances」を追加する。attendancesと複数形にする。

予備知識

dependent: :destroy は、対象のユーザー情報が削除された場合に、そのユーザーがもつattendanceデータも削除されるようにする

3.おなじみの「rails db:migrate」する

実行後、念のため、schema.rbファイルを確認

ちゃんと、user_id があります

4.Routingのネスト化

このままだと、あるuser(:従業員)のattendances(:勤務様態)を表示する際に

URL: https://○○.com/attendance[:id] 等となり、URLからuserとの結びつきが感じ取れないので、

URL:https://○○.com/user[id]/attendance[:id] のように関係性がわかるようにしたい

その場合、ルーティングをネストする (入れ子にする) ことで、この親子関係をルーティングで表すことができるようになります。

Railsガイド:Rail のルーティング

5.結構ハマった点

紐付けしたとはいえ、attendances_controller側で扱えるuserモデルは[:user_id]のみ。

Attendanceモデルから見れば、あくまでUserモデルは1対1ということ

天才はこれを読もう Railsガイド:Active Record の関連づけ

6.seedファイルでサンプル一括登録

入れ子になっているデータベースにも多くサンプルを登録したい場合の「seed.rb」記述方法

上がfakerを使った親model「userモデル」の一括登録、下が子model「taskモデル」の一括登録

コメント

タイトルとURLをコピーしました