はじめに
Ransackを使ってソート機能を実装する際にうまく行かず、検索してもあまり出てこなかったのでまとめておきます。
Ransackとは
RansackはRuby on Railsの検索機能を実装する際のGem(ライブラリ)です。
Railsで検索機能をつけるとしたらまず候補に上がるGemのRansack。
検索機能を簡単に実装できますが、テーブルのソート機能も簡単に実装できます。
gem 'ransack'
# Gemfileに追加して
$ bundle install
# bundle installしたら使えます。
Ransackの検索機能についてはこちらをみるとわかりやすいです。
Ransackでソート機能を実装する。
Ransackでソート機能を実装するには**sort_link
**を使うと簡単に実装できます。
基本的なソート機能の実装はこう記述します。
<th><%= sort_link(@q, :ソートしたいカラム名, "表示させたい名前" )%></th>
今回はこんなテーブル(表のこと)を例にしてみます。
<table>
<thead>
<tr>
<th>ID</th>
<th>名前</th>
<th>本の名前</th>
</tr>
</thead>
<tbody>
<% @results.each do |user|%>
<tr>
<td><%= user.id %>
<td><%= user.name %>
<td><%= user.book.book_name%></td>
</tr>
<% end %>
</tbody>
</table>
Usersテーブル
カラム名 |
---|
id |
name |
book_id |
Booksテーブル
カラム名 |
---|
id |
book_name |
単純なソート機能
<thead>
<tr>
<th><%= sort_link(@q, :id, "ID" )%></th>
<th><%= sort_link(@q, :name, "名前")%></th>
</tr>
</thead>
これだけでidとnameでソート機能が実装できます。
それではUsersテーブルとアソシエーションを組んでいるbooksテーブルがあるとして、booksテーブルのbook_nameカラムをテーブル(表のこと)に表示させていた場合に、ソートするにはどうしたらいいでしょうか?
アソシエーションを組んでいる別テーブルのカラムのソート
最初に単純にbook_nameと入れてみます。
<thead>
<tr>
<th><%= sort_link(@q, :id, "ID" )%></th>
<th><%= sort_link(@q, :name, "名前")%></th>
<th><%= sort_link(@q, :book_name, "本の名前")%></th>
</tr>
</thead>
しかし、これではソートの矢印は表示されますがソートされません。
アソシエーションを組んでいるテーブルでソートするにはこうします。
<th><%= sort_link(@q, :子テーブル名_カラム名, "表示させたい名前")%></th>
アソシエーションを組んでいるテーブルの名前(単数)に"_"
アンダーバーを入れて記述します。
この場合テーブル名にアンダーバーが入ったり、カラム名にアンダーバーが入ったりすることもあると思いますが大丈夫です。
先程のコードを修正してみます。
<thead>
<tr>
<th><%= sort_link(@q, :id, "ID" )%></th>
<th><%= sort_link(@q, :name, "名前")%></th>
<th><%= sort_link(@q, :book_book_name, "本の名前")%></th>
</tr>
</thead>
これでbook_nameもソートできるようになりました。
中間テーブルを挟んだ際のソート
中間テーブルを挟んだ孫テーブルのカラムをテーブル(表のこと)に表示させていて、それをソートしたいということがあると思います。
その際はこのように記述すればソートすることができます。
<th><%= sort_link(@q, :子テーブル名_孫テーブル名_カラム名, "表示させたい名前")%></th>
## 終わりに 管理画面などで一覧表示させてソートさせて、検索したいということは多々あると思います。 その際に参考になれれば嬉しいです。
参考サイト