LoginSignup
8
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-08-14

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

8
9
0

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
  3. You can use dark theme
What you can do with signing up
8
9