すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 orderメソッドを使って取得したデータを並び替えよう!

ぴっかちゃん
ぴっかちゃん

orderメソッドとは、データベースから取得してきた値を並び替えることができるメソッドです。

orderメソッドの基本構文
1
2
3
モデル名.order("並び替えたいカラム名")
# もしくは
モデル名.order(:並び替えたいカラム名)

orderメソッドを実際に使ってみよう

この章では、orderメソッドの使い方や実際の使用例を見ながら解説します。

orderメソッドの使い方

orderメソッドは下記のように記述します。

コントローラー | orderメソッドの使用例
1
2
3
4
5
# モデル名.order("並び替えたいカラム名")
User.order("name")

# モデル名.order(:並び替えたいカラム名)
User.order(:name)

上の例だとusersテーブルのnameカラムがアルファベット順・あいうえお順に並び替えられます。
また下記のように並び替えの順序も指定することができます。

コントローラー
1
2
3
モデル名.order("カラム名 DESC")
モデル名.order(カラム名: "DESC")
モデル名.order(カラム名: :DESC)

DESCと指定すると逆順に並び替えられます。
具体的に説明してみましょう。

1
モデル名.order("id")

このように書くとid順にデータを取得できます。
つまり1から順に取得されます。
ですがDESCを使って下記のように書いてみると…。

1
2
3
4
モデル名.order("id DESC")
# 下記のコードも同じ
モデル名.order(id: "DESC")
モデル名.order(id: :DESC)

今度はidが大きい順に取得されます。 
なのでidが1のレコードが一番最後になります。

ちなみにDESC(降順)の逆はASC(昇順)です。
デフォルトではASCになっているのでASCで指定することはあまりありません。
降順は階段を上から降りてくるイメージ、昇順は階段を登っていくイメージです。

上から降りてくるので大きい数字から、階段を登っていくので小さい数字からということになりますね。

ぴっかちゃん

処理の流れや用語に不安があるという方は、こちらの書籍も併用して学習すると良いでしょう。

実際にアプリ内で使ってみよう

この章では、環境を構築して実際にorderメソッドを使います。

環境を構築する

それではrailsのファイルを使って実際にorderメソッドを使ってみましょう。
下記のコマンドを順に実行してみましょう。
①git clone -b order https://github.com/miyagit/programan_dojo.git

② cd programan_dojo

③ bundle install
→ rbenv: version ‘2.4.1’ is not installed と表示された場合は、ruby -v と実行してください。

ruby -vと実行し出てきたversion(例: 2.3.1)と出てきたら、

vim .ruby-versionとし、
ruby -vで出てきた値(例: 2.3.1)に書き換えてください。

続いてvim Gemfileとし、ruby 2.4.1と書いてある部分をruby -vで出てきた値(例: 2.3.1)に書き換えてください。

④ rails db:create && rails db:migrate && rails db:seed

環境構築が完了しました。と表示されると、
本当にrails applicationが動作するかrails sコマンドで起動しましょう。

rails sを起動し、ブラウザでlocalhost: 3000と入力して下記のような画面が出てくれば環境構築完了です!

環境構築

このような画面が表示されば成功です。

アプリ内でコードを書いてみよう

それでは実際にコードを書いていきましょう。

programan_dojo/app/controllers/Main_controller.rb
上記のファイルを開けてください。すると

Main_controller.rb
1
2
3
4
5
class MainController < ApplicationController
  def top
     @title = "orderメソッドを使ってみよう"
  end
end

上記の用に記載されていると思います。
それを下記のように書き換えてください。

Main_controller.rb
1
2
3
4
5
6
class MainController < ApplicationController
    def top
        @title = "orderメソッドを使ってみよう"
        @users = User.all
    end
end

orderメソッドを使う前にallメソッドで全てのレコードを取ってきた場合はどのようになるかを確認してみます。
今回はallメソッドで全てのレコードを取得しました。
この場合、id順にレコードが取得されます。
では実際にビューで確認をしてみましょう。

/Users/yuya/Desktop/programan/programan_dojo/app/views/main/top.html.erb
こちらのファイルをいじっていきます。
@usersがこちらのビューファイルで使うことが出来るので、eachメソッドを使って自己紹介表を作りましょう。

top.html.erb
1
2
3
<div class='p-top'>
    <p class='p-top__title'>今回の記事の目標:<%= @title %></p>
</div>

上記から下記に変更してください。

top.html.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<div class='p-top'>
    <p class='p-top__title'>今回の記事の目標:<%= @title %></p>
    <table border="1" class= 'p-top__introduce'>
    <tr>
    <th>id</th>
    <th>名前</th>
    <th>年齢</th>
    <th>身長</th>
    <th>体重</th>
    </tr>
    <@users.each do |user| %>
      <tr>
      <td><%= user.id %></td>
      <td><%= user.name%></td>
      <td><%= "#{user.age}歳" %></td>
      <td><%= "#{user.tall}cm" %></td>
      <td><%= "#{user.weight}kg" %></td>
      </tr>
    <% end %>
  </table>
</div>

それでは表示してみましょう。

eachメソッド

このようにid順に表示されました。
それでは次にこれをorderメソッドで並び替えてみましょう。

アプリ内でorderメソッドを使ってみよう

次はorderメソッドを使い、名前がアルファベット順に並べ替えられた状態でレコードを取得してみましょう。
Main_controller.rbを下記のように編集してください。

Main_controller.rb
1
2
3
4
5
6
class MainController < ApplicationController
    def top
        @title = "orderメソッドを使ってみよう"
        @users = User.order("name")
    end
end

今回は名前を並び替えるのでnameカラムを指定します。

このように記述することによりnameカラムのデータをアルファベット順に取得することができます。

ですので、@usersという変数にはnameカラムがアルファベット順に並んだレコードが順に入っていることになります。

本当にその通りに取得できているかビューで確認をしてみましょう。

orderメソッド

このように名前がアルファベット順に表示できていれば成功です!

次は年齢でソートしてみましょう。
年齢はageカラムに入っています。
コントローラーにはどう記述したらよいでしょう?

1
2
3
4
5
6
class MainController < ApplicationController
    def top
        @title = "orderメソッドを使ってみよう"
        @users = User.order("age")
    end
end

そうですね、このように書けば年齢を昇順に取得できます。
ビューで確認をしてみましょう。

年齢でソート

しっかりと年齢が若い順に並んでいますね!
次はこれを年齢が高い順に並べ替えてみましょう。
どのように記述すればよかったでしょうか?

Main_controller.rb
1
2
3
4
5
6
class MainController < ApplicationController
    def top
        @title = "orderメソッドを使ってみよう"
        @users = User.order("age DESC")
    end
end

そうですね、このようにDESCと指定してあげれば順序が逆になります。
ビューで確認をしてみましょう。

DESC

このように年齢が高い順になりました。
他にも身長と体重があるので、ぜひ皆さんでコードを書き換えて試してみてください。
身長は「tall」カラムに、体重は「weight」カラムに保存されています。

この記事のまとめ

  • orderメソッドは取得してきた値をカラムごとに並べ替えることができるメソッド
  • 引数には並び替えたいカラム名を指定する
  • デフォルトでは昇順(ASC)になっている