LoginSignup
5

More than 5 years have passed since last update.

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

Posted at

編集の続き

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

実現したいこと

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

  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月 技術評論社

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
5