search
LoginSignup
9

More than 5 years have passed since last update.

posted at

updated at

Ransackのsort_linkでデフォルトの第2ソートを指定する方法

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の設定を追加する。

Ransack

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ソートになる。

RansackSample1.png

第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

結果
RansackSample.png

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ソートを指定することって出来るんだろうか。
探し方が悪いのか、見つけられなかった。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9