異なるデータを必要とする理由
管理するデータの性質上、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] のように関係性がわかるようにしたい
その場合、ルーティングをネストする (入れ子にする) ことで、この親子関係をルーティングで表すことができるようになります。
5.結構ハマった点
紐付けしたとはいえ、attendances_controller側で扱えるuserモデルは[:user_id]のみ。
Attendanceモデルから見れば、あくまでUserモデルは1対1ということ
天才はこれを読もう Railsガイド:Active Record の関連づけ
6.seedファイルでサンプル一括登録
入れ子になっているデータベースにも多くサンプルを登録したい場合の「seed.rb」記述方法
コメント