【Rails】君もActiveRecordマスターにならないか?②【limit&orderメソッド編】

本記事はこんな方に向けて書いています。

  • limitとorderメソッドの使い方を知りたい人
  • Active Recordの使い方に不安を感じている人
  • DBから自由に情報を取り出せるようになりたい人

プログラミングスクールのメンターとして、多くの受講生にRailsを教えていて、「ActiveRecord」の使い方に慣れていない人が多いなと感じています。

複雑な機能を実装しようとすると、どうしてもあるデータから特定の条件にあうデータを抽出するという作業が必要です。

逆にActiveRecordのメソッドを使いこなせれば、複雑な機能もgemに頼ることなく実装ができ、表現の幅を大きく広がります。

そこで本記事で紹介するのが「limit」と「order」メソッドです。
実際にScaffoldで簡単なアプリを作成して、動作を確認していきましょう!!

Scaffoldを使って学習の準備をしよう

今回は簡略化のため、アプリの雛形を簡単に作成できる『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です。

引き出すデータの数を指定する「limit」メソッド

「あるデータから先頭の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で指定した数だけデータを引き出せました!便利ですね!

取り出すデータの開始位置を指定する「offset」メソッド

「先頭から数えて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」メソッドです。使い方は下記の通りで、引数にカラム名と並び替えのオブションを指定します。

テーブル名.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」メソッドに関する解説は以上です!
お疲れ様でした。