前提・実現したいこと
楽曲とその音源を登録するアプリを作っています。1つの曲に対し複数の演奏音源がつきます。親モデルはpostで、子モデルはrecordingです。
楽曲(親モデル)を表示するページにて、Sortable Table Columnsおよび[Railsで並べ替え可能なテーブルの実装手順](a href="https://www.virment.com/rails-sortable-table/)を参考にして音源(子モデル)の情報をカラム別にソートできるテーブルを作っています。
発生している問題・エラーメッセージ
テーブルに表示されたリンクをクリックしても何も起こりません。
URL自体はhttp://localhost:3000/posts/60?direction=asc&sort=Mov2という風に機能します。
該当のソースコード
Ruby
1モデル 2Post.rb 3class Post < ApplicationRecord 4 has_many :recordings, dependent: :destroy 5 has_many :post_instruments 6 has_many :instruments, :through => :post_instruments, dependent: :destroy 7 accepts_nested_attributes_for :recordings, {allow_destroy: true} 8end 9 10recording.rb 11class Recording < ApplicationRecord 12 belongs_to :post 13 has_many :durations, dependent: :destroy 14 accepts_nested_attributes_for :durations 15 mount_uploader :image, ImageUploader 16end 17 18コントローラおよびヘルパー 19application_controller.rb 20 21ApplicationController 22class ApplicationController < ActionController::Base 23 include SessionsHelper 24 include RecordingsHelper 25end 26 27 28recordings_helper.rb 29 30module RecordingsHelper 31 def sortable(column, title = nil) 32 title ||= column.titleize 33 css_class = (column == sort_column) ? "current #{sort_direction}" : nil 34 direction = (column == sort_column && sort_direction == "asc") ? "desc" : "asc" 35 link_to title, {:sort => column, :direction => direction}, {:class => css_class} 36 end 37 38 def sort_direction 39 %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc" 40 end 41 42 def sort_column 43 Recording.column_names.include?(params[:sort]) ? params[:sort] : "name" 44 end 45end 46 47posts_controller 48helper_method :sort_column, :sort_direction 49 50 def show 51 @post = Post.includes(:instruments, :recordings=>:durations).find(params[:id]) 52 #@post.recordings.order(sort_column+ "" + sort_direction) 53 @post.recordings.order("recordings + sort_column+ ' ' + sort_direction") 54 @instruments = @post.instruments.order('created_at desc') 55 end 56 57ビュー(show.html.erb) 58 59<table> 60 61 <tr><%# Start of th %> 62 <% @instruments.each do |instrument| %>%# Start of instruments th %><%# 楽曲編成に応じてカラムを追加 %> 63 <% if instrument.name.include? 'orchestra' %><%# 管弦楽曲の場合、指揮者カラムを追加 %> 64 <th><%= sortable "conductor", "Conductor" %></th> 65 <% end %> 66 67 <% if instrument.name.include? "#{instrument.name}" %> 68 <th><%= sortable "#{instrument.name}","#{instrument.name}" %></th> 69 <% end %> 70 <% end %><%# End of instruments th %> 71 72 <% (1..@post.mov).each do |movnum| %><%# 楽章数に応じてカラム数が変化 %> 73 <th width="70"><%= sortable "Mov#{movnum}" %></th> 74 <% end %> 75 </tr><%# End of th %> 76 77 78<% @post.recordings.each do |recording| %> 79 80 <tr> 81 <% @instruments.each do |instrument| %> 82 83 <% if instrument.name.include? 'orchestra' %> 84 <td><%= recording.conductor %></td> 85 <% end %> 86 87 <% if instrument.name.include? "#{instrument.name}" %> 88 <td><%=recording.send("#{instrument.name}") %></td> 89 <% end %> 90 91 <% end %><%# End of the loop of instruments %> 92 93 <% recording.durations.each do |duration| %><%# 楽章ごとの演奏時間 %> 94 <td><%=Time.at(duration.total_seconds).utc.strftime("%M:%S") %></td> 95 <% end %><%# End of durations %> 96 97 </tr> 98 99 <% end %><%# End of the loop of each recordings %> 100 101</table>
試したこと
親モデルにおいて子モデルのデータをソートするには
親モデル.includes(:子モデル).oder("子モデル名の複数形.カラム名 DESC")
とすればいいらしいですが、それと今回のことをどう組み合わせればいいか分かりません。
Helperを親モデルにすることなどを試しましたが結果は変わりませんでした。
補足情報(FW/ツールのバージョンなど)
Ruby on Rails 6.0