編集の続き
さっき書いた、多対多な関係のものを表示したいときどうするか?って話。
実現したいこと
投稿:タグが 多:多な関連付けになっていて、間に関連付け用のモデルを挟んだ状態と仮定した上で
- 投稿の詳細を閲覧したときに、当該投稿に関連するタグが一括表示されること。
- 特定のタグを選択したときに、そのタグに関連する投稿一覧が表示されること。
実装前に検証
参考文献によると、
- まず、投稿を取得する。
- 投稿に関連するタグを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月 技術評論社