Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

railsにおいて、多対多な関連の表示を行う

編集の続き

さっき書いた、多対多な関係のものを表示したいときどうするか?って話。

実現したいこと

投稿:タグが 多:多な関連付けになっていて、間に関連付け用のモデルを挟んだ状態と仮定した上で

  1. 投稿の詳細を閲覧したときに、当該投稿に関連するタグが一括表示されること。
  2. 特定のタグを選択したときに、そのタグに関連する投稿一覧が表示されること。

実装前に検証

参考文献によると、

  • まず、投稿を取得する。
  • 投稿に関連するタグをeachで取得する
  • タグを一つ一つ表示する

という流れになるので、コンソール上で試す。
試してみたらうまくいきそうだ!

terminal
$ rails c
[4] pry(main)> @post = Post.find_by(id: 3)
  Post Load (0.1ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1  [["id", 3]]
=> #<Post:0x007fe42897a1a8 id: 3, name: "テスト登録2", mode: 1, desc: "テストです", created_at: Sun, 10 Jan 2016 10:20:47 UTC +00:00, updated_at: Sun, 10 Jan 2016 10:20:47 UTC +00:00>
[5] pry(main)> @post.tags.each do |tag|
[5] pry(main)*   puts tag
[5] pry(main)* end  
  Tag Load (0.2ms)  SELECT "tags".* FROM "tags" INNER JOIN "post_tags" ON "tags"."id" = "post_tags"."tag_id" WHERE "post_tags"."post_id" = ?  [["post_id", 3]]
#<Tag:0x007fe427e95cb0>
#<Tag:0x007fe427e95ad0>
=> [#<Tag:0x007fe427e95cb0 id: 1, label: "登録たぐ1", created_at: Sun, 10 Jan 2016 04:17:06 UTC +00:00, updated_at: Sun, 10 Jan 2016 04:17:06 UTC +00:00>,
 #<Tag:0x007fe427e95ad0 id: 2, label: "登録たぐ2", created_at: Sun, 10 Jan 2016 04:17:19 UTC +00:00, updated_at: Sun, 10 Jan 2016 04:17:19 UTC +00:00>]

コントローラ ビューの改修

コントローラ(べつにこれ、敢えて書かなくともよかった)

app/controllers/post_controller.rb
  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all
  end

  # GET /posts/1
  # GET /posts/1.json
  def show
    # これは、あえて書かなくとも良い
    @post = Post.find_by(id: params[:id])
  end

注:コントローラに関しては、indexとかshowに関しては、デフォルトで対応するモデルのすべて、または各指定idのものを取得するようになっているので、記述しなくとも良かった。

ビュー(showのケース)

(主要部だけ抜粋)

app/views/posts/show.html.erb
<p>
  <strong>関連タグ</strong>
  <br>
  <% unless @post.tags.empty? %>
    <ul>
    <% @post.tags.each do |tag| %>
        <li><%= tag.label %></li>
    <% end %>
    </ul>
  <% else %>
        たぐありません
  <% end %>
</p>
抜粋
unless @post.tags.empty?

これ、postに関連するタグがないかどうかの確認。あればtrue なければfalse

falseのときに

抜粋
<% @post.tags.each do |tag| %>
        <li><%= tag.label %></li>
    <% end %>

1つ1つeachで取得し、表示処理を実施。

参考

山田祥寛 Ruby on Rails4 アプリケーションプログラミング 2014年4月 技術評論社

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?