0
0

More than 3 years have passed since last update.

多対多のテーブルで関連付けたテーブルの情報を取得する方法

Last updated at Posted at 2020-08-27

この記事でわかる事

多対多の関係になるようにアソシエーションを組み、
関連づけたテーブルの情報取得をする方法。
※詳しい状態は前提に記載。

前提

言語:Ruby
  
私の作成中のアプリを例にします。
私はCDとそこに収録された曲を多対多でアソシエーションを組みました。
多対多の理由:CDには複数の曲が入っている。
       曲は複数のCDに入っていることもある。

visualMusic-Page-2.png

visualMusic-Page-3.png

ということで、
対対多のテーブルを作成。
中間テーブルも同時に作成。
※idやカラムはもっとありますが省略
visualMusic-Page-4 (1).png
ここまでが前提で出来ていて、
同じように多対多でアソシエーションを組んだ方はこの記事が参考になるはずです。

実装したいこと

このdiscsテーブルを元に、
各CDの詳細ページを作りたいということでViwe(show.haml.html)を用意。

(URL▶︎localhost:3000/discs/1)
<例①:disc_idが1の場合>
取得・表示したい情報:CD-Aに紐づいた曲(song-A,song-B,song-C)

<例②:disc_idが2の場合>
取得・表示したい情報:CD-Bに紐づいた曲(song-A,song-D,song-E)
 
 
:point_right_tone1:関連したテーブルからも情報を取得したい!というのが今回の目標です。

例①のテーブルの図

visualMusic-Page-4 (2).png
関連するピンクの曲名も同じページに表示されれば成功です。
何となくやりたいことは理解いただけたでしょうか?
 
  

実際のコード

ここでURLで表示されていたidを取得してきます。
例だとdisc_id:1ですね。ユーザーがid:1のCDの情報が欲しいと指示できる訳です。

discs_controller.rb
class DiscsController < ApplicationController
#省略

  def show
    @disc = Disc.find(params[:id])
  end

#省略
end
show.html.haml(show.html.erbの場合はhamlをhtmlに変換してください。)

- @disc.songs.each do |song|
    = song.name

ルーティングは「resources :discs,only: [:show]」という感じで:showを入れてます。

ポイント

テーブルを跨いじゃう時の記述がポイントかと思います。

show.html.haml(show.html.erbの場合はhamlをhtmlに変換してください。)

- (params[:id]を取得した変数).(所得したい関連テーブル名).each do |(以下で使う変数)|
    =(上記で指定した変数).(所得したテーブル内で表示したいカラム名)

説明がクドイと思いましたが詳しく書いてみました。

  
  
以上で表示出来たかと思います。
お疲れ様でした!
 
  

ひとことMemo

自身は正直本当に初心者で
現在、アソシエーションを組むメリット、
親子関係にするメリットなども理解が追いついていません。
ただ、今回、多対多にすることで単体のテーブルに紐づいたビューでも他のテーブル情報がとって来られることがわかりました。
クライアントから受け取れるURLからの情報は「/discs/1」とか「/discs/1/song」とか「discs/new」とかこうしたものからなのだと気づいたり。
また、ルーティングではメインとなる情報元のテーブルの指示を受け、表示されるviwe情報を受け取ってたり、コントローラーでテーブルから取ってくる情報が記述出来たり、気付きばかり。

同じように基礎部分で悩んでいる方がこれで何かヒントを掴んでくださったなら、
自分がここで躓いたことに意味があるはず!と思い、
未来にまた同じところで躓く自分への記事としてここに記録しました。
  
  
最後まで読んでくださって、ありがとうございました:relaxed:
ではまた:wave:

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