前提・実現したいこと
お世話になります。
現在railsで掲示板サイトを作っています。
コメントにユーザーからの投票による点数を設定し、点数順で並び替え、その下にそのコメントへの返信を表示させたいと考えております。
イメージとしてはRedditのように
コメント
返信
返信の返信
・
・
・
といった形でツリー状に続いていくようにしたいです。
コメントに、parent_post_idというカラムを設け、そこに親コメントのidを挿入しています。親コメントの場合はdefaultで0です。
発生している問題・エラーメッセージ
どうすれば思い通りの並び方を実現できるのかがわかりません。sort_byを用いてscoreとparent_post_idで並び替えればどうなるかと試してましたが、できませんでした。
parent_post_idが0の場合はpost.idを取得し、parent_post_idが設定されている場合はparent_post_idを取得し、それで並び替える、というふうにすればできるのではないかと思いましたが、どうすればそれを実現できるのかがわかりません。
該当のソースコード
rb
1controller 2 def index 3 @posts= @topic.posts.sort_by{ |p| [p.score, p.parent_post_id] }.reverse 4 end
erb
1<% posts.each do |post| %> 2 <% if post.parent_post_id == 0 %> 3 <div class="card"> 4 <% else %> 5 <div class="card reply"> 6 <% end %> 7 <div class="card-body post-card"> 8 <div class="row align-items-center"> 9 <div class="col-1 text-center"> 10 <div id="vote-actions-<%= post.id %>" class="vote" data-id="<%=post.id%>"> 11 <div class="fa fa-arrow-up upvote <%= is_upvoted post %> "></div> 12 <span class="font-weight-bold score"><%= post.score%></span> 13 <div class="fa fa-arrow-down downvote <%= is_downvoted post %>"></div> 14 </div> 15 </div> 16 <div class="col-11"> 17 <small class="card-title"> 18 <%= link_to post.user.name , profile_path(post.user.userid) %> 19 <%= post.user.karma %> 20 <span class ="float-right"><%= post.created_at.strftime("%Y-%m-%d %H:%M:%S")%></span> 21 </small> 22 <div class="card-text"> 23 <% if post.post_image.present? %> 24 <%= image_tag post.post_image.thumb50.url, class: "post-image"%> 25 <% end %> 26 <br> 27 <p><%= safe_join(post.content.split("\n"),tag(:br)) %></p> 28 </div> 29 30 <% unless current_user.id == post.user_id || post.parent_id == 0%> 31 <button type="button" class="btn reply-btn" data-toggle="modal" data-target="#replyModal" data-parent= <%= post.id %>> 32 <i class="fas fa-plus"></i>返信する 33 </button> 34 <% end %> 35 36 <div class="card-info float-right"> 37 38 <% if current_user.id == post.user_id %> 39 <%= link_to(edit_post_path(post)) do %> 40 <i class="fas fa-pen ml-3"></i> 41 <% end %> 42 <%= link_to(post, method: :delete, data: { confirm: 'Are you sure?' }) do %> 43 <i class="far fa-trash-alt ml-3"></i> 44 <% end %> 45 <% end %> 46 </div> 47 </div> 48 </div> 49 </div> 50 </div> 51 52 <% end %> 53 54 55 56
試したこと
sort_byでscoreとparent_post_idで並び替えてみた。
補足情報(FW/ツールのバージョンなど)
Rails 6.0.3.1
mysql Ver 14.14 Distrib 5.5.62, for Linux (x86_64) using readline 5.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/29 04:24
2020/05/29 08:22
2020/05/29 09:32