【Rails】orderメソッドを徹底解説!

Rails

orderメソッドとは

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

orderメソッドの使い方

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

ruby
1
2
3
モデル名.order("並び替えたいカラム名"
# 例
User.order("name")

上の例だとusersテーブルのnameカラムがアルファベット順・あいうえお順に並び替えられます。

また下記のように並び替えの順序も指定することができます。

ruby
1
モデル名.order("カラム名 DESC")

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

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

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

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

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

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

複数の指定の仕方

orderメソッドは下記のように書くと一度に複数のカラムを指定することもできます。

ruby
1
モデル名.order("カラム名 DESC, カラム名 DESC, カラム名 DESC")

上の例だと指定した3つのカラムを降順に取得できます。

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

それでは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
上記のファイルを開けてください。すると

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

上記の用に記載されていると思います。

それを下記のように書き換えてください。

ruby
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メソッドを使って自己紹介表を作りましょう。

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

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

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メソッドを使い、名前がアルファベット順に並べ替えられた状態でレコードを取得してみましょう。
maincontrollerを下記のように編集してください。

ruby
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カラムに入っています。
コントローラーにはどう記述したらよいでしょう?

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

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

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

ruby
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メソッドは取得してきた値をカラムごとに並べ替えることができるメソッドです。