Ransackのsort_linkを使用した時に、第2ソートはidの昇順となっているが、それを他の項目に変更する方法。
準備
確認用にtitleとbodyを持ったDialyをscaffoldして作成する。
scaffold
rails generate scaffold dialy title:string body:text
その他
Gemfileに下記を追加してbundle installを実行。
gem 'ransack', github: 'activerecord-hackery/ransack', branch: 'rails-4.1'
Ransackの設定を行う
下記サイトのREADMEを参考に、scaffoldした状態にRansackのsort_linkの設定を追加する。
dialies_controller.rb
# GET /dialies
# GET /dialies.json
def index
@q = Dialy.search(params[:q])
@dialies = @q.result(distinct: true)
end
index.html.erb
<h1>Listing dialies</h1>
<table>
<thead>
<tr>
<th>ID</th>
<%= content_tag :th, sort_link(@q, :title) %>
<th>Body</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @dialies.each do |dialy| %>
<tr>
<td><%= dialy.id %></td>
<td><%= dialy.title %></td>
<td><%= dialy.body %></td>
<td><%= link_to 'Show', dialy %></td>
<td><%= link_to 'Edit', edit_dialy_path(dialy) %></td>
<td><%= link_to 'Destroy', dialy, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Dialy', new_dialy_path %>
Titleだけにsort_linkをつけている。
第2ソートを設定しない場合
何も設定しないとidの昇順がデフォルトの第2ソートになる。
第2ソートを指定した場合
そこで、dialies_controller.rb#indexを下記に変更する。
(条件入れているところは、もっとうまく書きたい…)
dialies_controller.rb
# GET /dialies
# GET /dialies.json
def index
# 第2ソート順にbodyの昇順を設定
search_params = params[:q]
search_params[:s] = [search_params[:s], "body asc"] unless (search_params.nil? || search_params[:s].nil?)
@q = Dialy.search(search_params)
@dialies = @q.result(distinct: true)
end
idの昇順からbodyの昇順に第2ソートが変更されている。
今回は、Arrayで第2ソートを追加したけれどRansackのソースを見ると他にもHashとStringで指定出来るみたい。
search.rb
def sorts=(args)
case args
when Array
# 省略
when Hash
# 省略
when String
# 省略
else
raise ArgumentError, "Invalid argument (#{args.class}) supplied to sorts="
end
end
alias :s= :sorts=
viewだけで第2ソートを指定することって出来るんだろうか。
探し方が悪いのか、見つけられなかった。