本記事はこんな方に向けて書いています。
- limitとorderメソッドの使い方を知りたい人
- Active Recordの使い方に不安を感じている人
- DBから自由に情報を取り出せるようになりたい人
プログラミングスクールのメンターとして、多くの受講生にRailsを教えていて、「ActiveRecord」の使い方に慣れていない人が多いなと感じています。
複雑な機能を実装しようとすると、どうしてもあるデータから特定の条件にあうデータを抽出するという作業が必要です。
逆にActiveRecordのメソッドを使いこなせれば、複雑な機能もgemに頼ることなく実装ができ、表現の幅を大きく広がります。
そこで本記事で紹介するのが「limit」と「order」メソッドです。
実際にScaffoldで簡単なアプリを作成して、動作を確認していきましょう!!
Contents
今回は簡略化のため、アプリの雛形を簡単に作成できる『Scaffold』を使って解説していきます。まずは下記手順にしたがって操作を行ってください。
ターミナルで下記コマンドを実行しましょう。
//railsの雛形を作成
rails new active_record_app
//アプリのディレクトリに移動
cd active_record_app
//scaffoldでPostモデルに関連するファイルを作成
rails g scaffold Post title:string content:string
//データベースを作成
rails db:create
//マイグレーションファイルを実行
rails db:migrate
ここまでで必要なファイル・フォルダの作成が完了です。
あとは、ターミナルで「rails s」を実行、「localhost:3000」にアクセスしてください。下画像が表示されればOKです。

次にダミーデータを作成して、whereやpluckメソッドを使用できるようにしましょう。作成した「pluck_where_app」アプリの配下にある / db / seeds.rbを開いてください。
このseeds.rbにコードを書いておくと、自動でコードに基づきダミーデータを作成してくれます。ではseed.rbを開き、下記コードを貼り付けてください。
Post.create([
{ id: 1, title: 'テスト1のタイトル', content: 'テスト1の内容' ,pv:1000},
{ id: 2, title: 'テスト2のタイトル', content: 'テスト2の内容' ,pv:200},
{ id: 3, title: 'テスト3のタイトル', content: 'テスト3の内容' ,pv:350},
{ id: 4, title: 'テスト4のタイトル', content: 'テスト4の内容' ,pv:460},
{ id: 5, title: 'テスト5のタイトル', content: 'テスト5の内容' ,pv:570},
{ id: 6, title: 'テスト6のタイトル', content: 'テスト6の内容' ,pv:3000},
{ id: 7, title: 'テスト7のタイトル', content: 'テスト7の内容' ,pv:1200},
{ id: 8, title: 'テスト8のタイトル', content: 'テスト8の内容' ,pv:750},
{ id: 9, title: 'テスト9のタイトル', content: 'テスト9の内容' ,pv:1600},
{ id: 10, title: 'テスト10のタイトル', content: 'テスト10の内容' ,pv:5000}
])
上記コードはPostに関する10個のダミーデータです。
このデータを作成するために、ターミナルで下記コマンドを実行しましょう。
rails db:seed
コマンドを実行してエラーが発生しなければ成功です。
念のためターミナルでコンソールを開き確認しましょう。
rails c
//実行結果
irb(main):001:0>Post.all
//実行結果
=> #<ActiveRecord::Relation [#<Post id: 1, title:
"テスト1のタイトル", content: "テスト1の内容", pv: 1000,
created_at: "2021-02-18 16:09:09.229669000 +0000", updated_at:
"2021-02-18 16:09:09.229669000 +0000">, #<Post id: 2, title:
"テスト2のタイトル", content: "テスト2の内容", pv: 200, created_at:
"2021-02-18 16:09:09.239853000 +0000", updated_at: "2021-02-18
16:09:09.239853000 +0000">,(以下省略.....)
seeds.rbに書いたデータが反映されていればOKです。
「あるデータから先頭の3つだけ取り出したい!」というようなことは結構あります。その場合に使えるのが「limit」メソッドです。
下のようにlimitの引数に数を指定するだけで使えます。
テーブル名.limit(引き出したいデータの数)
では実際に使ってみましょう。
ターミナルで下記コマンドを実行してください。
irb(main):012:0> Post.limit(3)
//実行結果
//上位3つのデータのみ引き出せた!
=> #<ActiveRecord::Relation [#<Post id: 1, title:
"テスト1のタイトル", content: "テスト1の内容", pv: 1000, created_at:
"2021-02-18 16:09:09.229669000 +0000", updated_at: "2021-02-18
16:09:09.229669000 +0000">, #<Post id: 2, title: "テスト2のタイトル"
, content: "テスト2の内容", pv: 200, created_at: "2021-02-18
16:09:09.239853000 +0000", updated_at: "2021-02-18 16:09:09.
239853000 +0000">, #<Post id: 3, title: "テスト3のタイトル",
content: "テスト3の内容", pv: 350, created_at: "2021-02-18
16:09:09.247003000 +0000", updated_at: "2021-02-18 16:09:09.
247003000 +0000">]>
limitで指定した数だけデータを引き出せました!便利ですね!
「先頭から数えて2番目のデータ以降を取り出したい!」みたいな時に使えるのが、「offset」メソッドです。
offsetメソッドは、limitと同じように引数に、「データの取り出し開始位置」を数字で指定してあげます。
テーブル名.offset(データの取り出し開始位置)
注意点としては、取り出し開始位置は、0から始まるという点です。例えば、2番目から取り出したい場合は、下記のように引数を1にする必要があります。
//良い例
テーブル名.offset(1)
=> Post_id:2~10を取り出すという意味
//NG例
テーブル名.offset(2)
=> Post_id:3~10を取り出すという意味
limitとoffsetの合わせ技も可能!!
limitとoffsetメソッドを組み合わせて使うこともできます。
例えばPostデータから「先頭から数えて3番目から2つデータを取り出したい!」場合は、下記のように実行します。
irb(main):017:0> Post.limit(2).offset(2)
//実行結果
//Post_idが3と4のデータを取得できた!
=> #<ActiveRecord::Relation [#<Post id: 3, title:
"テスト3のタイトル", content: "テスト3の内容", pv: 350,
created_at: "2021-02-18 16:09:09.247003000 +0000",
updated_at: "2021-02-18 16:09:09.247003000 +0000">,
#<Post id: 4, title: "テスト4のタイトル", content: "テスト4の内容",
pv: 460, created_at: "2021-02-18 16:09:09.255412000 +0000",
updated_at: "2021-02-18 16:09:09.255412000 +0000">]>
このようにActiveRecordのメソッドは組み合わせて使用することができるのが、Railsの強みだと考えています。
「値が大きい順にデータを取り出して表示させたい!」「記事作成日が新しい順に並び替えたい!」みたいなことは頻繁にあります。
これを実現するのが、「order」メソッドです。使い方は下記の通りで、引数にカラム名と並び替えのオブションを指定します。
テーブル名.order(カラム名: :オプション)
//オプション名に関して
値が大きい順に並べる場合=> オプションに「desc」
値が小さい順に並べる場合=> オプションに「asc」
例えばPostデータをidの値が高い順番に並び替えたいと思います。
irb(main):019:0> Post.order(id: :desc)
//実行結果
//Post_idが10,9,8....の順で取り出される
=> #<ActiveRecord::Relation [#<Post id: 10, title:
"テスト10のタイトル", content: "テスト10の内容", pv: 5000,
created_at: "2021-02-18 16:09:09.297303000 +0000", updated_at:
"2021-02-18 16:09:09.297303000 +0000">, #<Post id: 9, title:
"テスト9のタイトル", content: "テスト9の内容",(以下省略....)
以上で「limit」と「order」メソッドに関する解説は以上です!
お疲れ様でした。