0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

カラムの値ごとにeach文を回す方法【Rails】

Last updated at Posted at 2022-07-21

本記事の内容はN+1問題を引き起こしています。
改善策はこちらの記事を参考にしてください。

目的

hogesテーブルをジャンルごとに分けて出力したい。

目標物の確認

今回作成したいページはこのような見た目です。
スライド1.JPG

MCVの準備

今回の目標物を実現するために最低限必要なファイルは以下です。

モデル

Hogeモデル:メインとなるhogesテーブルのモデルです。
idカラム:データ作成と共に自動付与される値
contentカラム:表示する内容
genre_idカラム:今回ポイントとなるカラムです。genreモデルと紐づけるためのカラムです。

Genreモデル:Hogeモデルのgenre_idカラムと紐づけるためのモデルです。
idカラム:データ作成と共に自動付与される値。hogeモデルのgenre_idカラムと紐づけます。
nameカラム:genre名を設定します。

スライド2.JPG

コントローラ

コントローラファイル
# アクション内で
@genres = Genre.all

ビューファイル

ビューファイル
<% @genres.each do |genre| %>
  <p><%= genre.name %></p>
  <% hoges = Hoge.where(genre_id: genre.id) %>
  <table>
  <tr>
    <td>id</td><td>content</td>
  </tr>
  <% hoges.each do |hoge| %>
    <tr>
      <td><%= hoge.id %></td>
      <td><%= hoge.content %></td>
    </tr>
  <% end %>
  </table>
<% end %>

解説

2段階で考えます。
まず、コントローラで定義した@genresに対してeach文を回します。
<p><%= genre.name %></p>の部分ではジャンル名を表示しています。
each文の中で、hogesという変数を定義します。
hogeswhereメソッドにより、現在each文で回っているgenreのidをgenre_idにもつ配列として定義されます。
そしてそのhogesに対してeach文を回します。
hogesに対するeach文が終了すると、@genresの1周目のeachが終了します。
続いて、@genresの2周目のeachが開始します。

これにより、hogesテーブルのgenre_idごとにeach文を回すことができました。

スライド3.JPG

まとめ

今回はカラムの値ごとにeach文を回す方法を紹介しました。
2段構造でeach構文を作るという少し複雑な方法ですが、ぜひ試してみてください。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?