質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1420閲覧

rails お題ごとの個別のランキング表示

taixnihsi

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/05/22 04:07

編集2020/05/22 04:13

個別のランキング表示

現在ruby on rails でお題投稿(theme)に関連付けた回答(answer)のいいね機能を用いたランキング機能を作成しております。
ランキング表示することはできたのですが、個々のお題に関する回答のランキングではなく、お題に対する回答全体でのランキング表示になってしまいました。
個別のお題に対するランキングを実装するにはどのようにコードを記述すればよろしいでしょうか?

・参考にした記事:https://qiita.com/mitsumitsu1128/items/18fa5e49a27e727f00b4

発生している問題・エラーメッセージ

該当のソースコード

answerrb

1class Answer < ApplicationRecord 2 belongs_to :user 3 belongs_to :theme 4 has_many :favorites, dependent: :destroy 5 6 def favorited_by?(user) 7 favorites.where(user_id: user.id).exists? 8 end 9 10 def self.create_all_ranks #Answerクラスからデータを取ってくる処理なのでクラスメソッド! 11 Answer.find(Favorite.group(:answer_id).order('count(answer_id) desc').limit(3).pluck(:answer_id)) 12 end 13end 14

themerb

1class Theme < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 belongs_to :user 4 has_many :answers, dependent: :destroy 5 6 has_many :favorites, dependent: :destroy 7end 8

userrb

1class User < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable 5 has_many :themes, dependent: :destroy 6 has_many :answers, dependent: :destroy 7 has_many :favorites, dependent: :destroy 8 9end 10

favoriterb

1class Favorite < ApplicationRecord 2 belongs_to :user 3 belongs_to :answer 4end 5```themesのshowページになります[![イメージ説明](b14bbd3af5cb40e22dce3b4ee304787c.png)](42ccd498b02a0db94fca6229cee9b493.png) 6```showhtmlerb 7<!--#themesのshowページにランキングを表示します!--> 8 9<div class="themes-show main"> 10 <div class="themes-show container"> 11 12 <div class="show theme"> 13 <h3>お題</h3> 14 <p><%= image_tag @theme.image_url %></p> 15 <p><span>お題: </span><%= @theme.content %></p> 16 <div class="t-user_info"> 17 <p><span>投稿者:</span><img src=<%= @theme.user.image %> class = "t-icon_image"> 18 <%= @theme.user.username %></p> 19 <p><%=time_ago_in_words(@theme.created_at) %> ago</p> 20 </div> 21 </div> 22 23 <!-- answer-wrapperの中にanswer-listとanswer-ranking --> 24 <div class="answer-wrapper"> 25 <div class="answer-list"> 26 <hr><h2>回答一覧</h2><hr> 27 <% @answers.each do |answer| %> 28 <p> 29 <span>回答者: </span> 30 <img src=<%= @theme.user.image %> class = "t-icon_image"><span> : </span> 31 <%= answer.user.username unless answer.user.blank? %> 32 </p><br> 33 <p><span>回答: </span><%= answer.answer %></p> 34 <% if user_signed_in? %> 35 <% if answer.favorited_by?(current_user) %> 36 <%=link_to theme_answer_favorites_path(@theme,answer.id), method: :delete do %> 37 <span class="fa fa-heart like-btn"></span><%= answer.favorites.count %> 38 <% end %> 39 <% else %> 40 <%=link_to theme_answer_favorites_path(@theme,answer.id), method: :post do %> 41 <span class="fa fa-heart like-btn-unlike"></span><%= answer.favorites.count %> 42 <% end %> 43 <% end %> 44 <% end %> 45 <br><%= link_to "回答を削除する",theme_answer_path(@theme,answer),method: :delete %><hr> 46 <% end %> 47 </div> 48 <!----> 49 <div class="answer-ranking"> 50 <hr><h2>ランキング</h2><hr> 51 <% @all_ranks.each do |answer| %> 52 <p> 53 <span>回答者: </span><img src=<%= @theme.user.image %> class = "t-icon_image"><span> : </span> 54 <%= answer.user.username unless answer.user.blank? %> 55 </p> 56 <br> 57 <p><span>回答: </span><%= answer.answer %></p> 58 <% if user_signed_in? %> 59 <p><span>お気に入り数: </span><%= answer.favorites.count %></p><hr> 60 <% end %> 61 <% end %> 62 </div> 63 </div> 64 <!-- answer-wrapperの中にanswer-listとanswer-ranking --> 65 66 <div class="answer-form"> 67 <% if user_signed_in? %> 68 <%= form_with(model: [@theme, @theme.answers.build], local: true) do |f| %> 69 <%= f.text_area :answer%> 70 <%= button_tag type: "submit" do %> 71 <i class="far fa-comments"></i> コメントする 72 <% end %> 73 <% end %> 74 <% end %> 75 <ul> 76 <li><%= link_to "お題を編集する",edit_theme_path(@theme.id) %></li> 77 <li><%= link_to "お題を削除する",theme_path(@theme.id) ,method: :delete %></li> 78 </ul> 79 </div> 80 81 </div> 82</div> 83

themescontroller

1 2def show 3 @theme = Theme.find(params[:id]) 4 @answers = @theme.answers 5 @all_ranks = Answer.create_all_ranks

answercontroller

1class AnswersController < ApplicationController 2 before_action :authenticate_user! 3 4 def create 5 theme = Theme.find(params[:theme_id]) 6 @answer = theme.answers.new(answer_params) 7 @answer.user_id = current_user.id 8 if @answer.save 9 flash[:success] = "コメントしました" 10 redirect_back(fallback_location: root_path) 11 else 12 flash[:success] = "コメントできませんでした" 13 redirect_back(fallback_location: root_path) 14 end 15 end 16 17 def destroy 18 @theme = Theme.find(params[:theme_id]) 19 @answer = @theme.answers.find(params[:id]) 20 @answer.destroy 21 redirect_back(fallback_location: root_path) 22 end 23 24 private 25 26 def answer_params 27 params.require(:answer).permit(:answer) 28 end 29end

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

answer と favoriteのみの関連付けでいけると勘違いしていました。
themeとfavoriteでもしっかり関連付けさせてあげ、whereメゾットを利用することでできました。

themescontroller

1def show 2 @theme = Theme.find(params[:id]) 3 @answers = @theme.answers 4#モデルで記述していたのをコントローラーにまとめた 5#.where(theme_id: params[:id])を追加 6#.where(theme_id: params[:id]の部分はルーティングで確認したurlが;idで記述されてたので、theme_id: params[:theme_id] ではなくparams[:id]と記述 7 @all_ranks = Answer.find(Favorite.where(theme_id: params[:id]).group(:answer_id).order('count(answer_id) desc').limit(3).pluck(:answer_id)) 8 end

answerrb

1class Answer < ApplicationRecord 2 belongs_to :user 3 belongs_to :theme 4 has_many :favorites, dependent: :destroy 5 6 def favorited_by?(user) 7 favorites.where(user_id: user.id).exists? 8 end 9#モデルでの記述を削除 10 # def self.create_all_ranks #Answerクラスからデータを取ってくる処理なのでクラスメソッド! 11 # Answer.find(Favorite.group(:answer_id).order('count(answer_id) desc').limit(3).pluck(:answer_id)) 12 # end 13end

railsroutes

1(ルーティングの確認) 2theme GET /themes/:id(.:format) themes#show

themerb

1class Theme < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 belongs_to :user 4 has_many :answers, dependent: :destroy 5#favoriteのとの関連付けを追加 6 has_many :favorites, dependent: :destroy 7end 8

favoriterb

1class Favorite < ApplicationRecord 2 belongs_to :user 3 belongs_to :answer 4#themeとの関連付けを追加 5 belongs_to :theme 6end

投稿2020/05/22 08:38

taixnihsi

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問