9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ransackで外部キーをつけているテーブルをソートする

Posted at

image.png

はじめに

Ransackを使ってソート機能を実装する際にうまく行かず、検索してもあまり出てこなかったのでまとめておきます。

Ransackとは

RansackはRuby on Railsの検索機能を実装する際のGem(ライブラリ)です。
Railsで検索機能をつけるとしたらまず候補に上がるGemのRansack
検索機能を簡単に実装できますが、テーブルのソート機能も簡単に実装できます。

ransackのインストール
gem 'ransack'
# Gemfileに追加して

$ bundle install
# bundle installしたら使えます。

Ransackの検索機能についてはこちらをみるとわかりやすいです。

Pikawaka【Rails】 ransackを使って検索機能がついたアプリを作ろう!

Ransackでソート機能を実装する。

Ransackでソート機能を実装するには**sort_link**を使うと簡単に実装できます。
基本的なソート機能の実装はこう記述します。

ソートの構文
<th><%= sort_link(@q, :ソートしたいカラム名, "表示させたい名前" )%></th>

今回はこんなテーブル(表のこと)を例にしてみます。
index.html.erb
<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>

これだけでidnameでソート機能が実装できます。

それではUsersテーブルとアソシエーションを組んでいるbooksテーブルがあるとして、booksテーブルのbook_nameカラムをテーブル(表のこと)に表示させていた場合に、ソートするにはどうしたらいいでしょうか?

image.png

アソシエーションを組んでいる別テーブルのカラムのソート

最初に単純に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>

## 終わりに 管理画面などで一覧表示させてソートさせて、検索したいということは多々あると思います。 その際に参考になれれば嬉しいです。

image.png

参考サイト

-Qiita Ransackのsort_linkで孫テーブルの値でソートする

9
5
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
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?