今日はRailsにて多対多のテーブルの実装をやってみたいと思います。

まずモデルはこうなっている
th_wordsstudiesが多対多の関係。中間テーブルもある。

th_wordsとstudiesが多対多で結ばれています。

今回はth_wordsに、更に子テーブルとしてjp_wordsが、リレーションされています。
それまで表示してみたいと思います。

多対多の関連付け

これはモデルに記載します。

まずStudyモデル

中間テーブルだからどちらにも属しているね。belongs_to と書くよ


class StudyThWord < ApplicationRecord
  belongs_to :th_word
  belongs_to :study
end
 

次に th_wordsモデル

#ここも2行かくよ
 has_many :study_th_words
 has_many :studies, through: :study_th_words

 

次に中間テーブルの study_th_wordsモデル/h3>

class StudyThWord < ApplicationRecord
  belongs_to :th_word
  belongs_to :study
end

 

これでモデルはOKだね。
あとはコントローラーに記載する。
でもその前にViewにどのように表示したいかを考えないとね。
で画面を確認

このレッスンページがstudyのページ、それにいくつものタイ語が関連づいている
わからなくなったら上に掲載していたER図をみてみよう!
ではこれを踏まえてコントローラーを記載

StudiesController
  def show
    #@sudyには現在Viewに表示されているidをとってきて、代入する
    @study = Study.find(params[:id])
  #@wordsにはそのstudyと多対多の関連で結びついているものを詰め込んでね。たくさん取得できるから複数形にしておくね。
    @words = @study.th_words
  end

 

showに全て書いてみたよ。わかりやすいように
before_action :set_study,
は外しておいた。このshowメソッドがすべて。

あとはこれに基づいてViewに書くだけだね。

sutudy showメソッド


#@wordsにはたくさんのth_wordsが入っているから、eachで回すよ。配列に格納している数だけループしてね ループの中では th_wordを使うよ
<% @words.each do |th_word| %>
#ここは下線を引いているだけだね。あまり考えなくていい。
#tag.divはdivタグを履いているだけ。気にしないでいいよ。その次が大切 th_wordでth_wordsのテーブルが取れる、その中のカラムのwordを表示するということだよ。{以下はcssを当てているだけだね。 <%= tag.div th_word.word, {class: "col-md-4", style: "font-size: 1.62rem; "} %> #この行では th_wordsテーブルの発音記号を表示しているよ <%= tag.div th_word.pronounce, {class: "col-md-4", style: "font-size: 1.62rem;"} %> #ここからは関連づいているth_wordに関連づいているjp_wordsを表示するよ。でもjp_wordは配列なので考慮しないとね だからまた、eachでループを回すよ <% th_word.jp_words.each do |jp_word| %> <%= tag.div jp_word.word, {class: "col-md-4", style: "font-size: 1.5rem;"} %> <% end %>
<% end %>

 

これでいいかな。
Railsの多対多の関連づけを解説してみたよ。

順番は、まず
1.モデルのリレーション(2行きちんと書こうね。)
2.コントローラーに詰め込む。このときにViewでどのように使いたいかイメージしておくことだね。
3.Viewに書いていく。ここはインスタンス変数に詰め込まれているものを表示するだけ。
コントローラーのほうが大切かな。
あと今日はth_wordが更に子テーブルを持っていたので、再度ループをかけたね。そうしないとエラーで表示されない。

というわけで、無事 railsの多対多のテーブルの実装ができました。
質問があれば、下記にてコメント下さい。
また間違いがあれば、教えて下さい。

めでたしめでたし。

参考サイト
https://railsguides.jp/association_basics.html#has-many-through%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です