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

本記事はこんな方のために書いています。

  • whrereとpluckメソッドの使い方を知りたい人
  • Active Recordの使い方に不安を感じている人

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

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

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

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

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

今回は簡略化のため、アプリの雛形を簡単に作成できる『Scaffold』を使って解説していきます。まずは下記手順にしたがって操作を行ってください。

ターミナルで下記コマンドを実行しましょう。

//railsの雛形を作成
rails new pluck_where_app

//アプリのディレクトリに移動
cd pluck_where_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の内容' },
	{ id: 2, title: 'テスト2のタイトル', content: 'テスト2の内容' },
	{ id: 3, title: 'テスト3のタイトル', content: 'テスト3の内容' },
	{ id: 4, title: 'テスト4のタイトル', content: 'テスト4の内容' },
	{ id: 5, title: 'テスト5のタイトル', content: 'テスト5の内容' },
	{ id: 6, title: 'テスト6のタイトル', content: 'テスト6の内容' },
	{ id: 7, title: 'テスト7のタイトル', content: 'テスト7の内容' },
	{ id: 8, title: 'テスト8のタイトル', content: 'テスト8の内容' },
	{ id: 9, title: 'テスト9のタイトル', content: 'テスト9の内容' },
	{ id: 10, title: 'テスト10のタイトル', content: 'テスト10の内容' }
])

上記コードはPostに関する10個のダミーデータです。
このデータを作成するために、ターミナルで下記コマンドを実行しましょう。

rails db:seed

コマンドを実行してエラーが発生しなければ成功です。
念のためターミナルでコンソールを開き確認しましょう。

rails c

//実行結果
irb(main):001:0>Post.all

//実行結果
#<ActiveRecord::Relation [#<Post id: 1, title: "テスト1のタイトル",
 content: "テスト1の内容", created_at: "2021-02-18 15:26:14.3829160
00 +0000", updated_at: "2021-02-18 15:26:14.382916000 +0000">, 
#<Post id: 2, title: "テスト2のタイトル", content: "テスト2の内容", 
created_at: "2021-02-18 15:26:14.400698000 +0000", updated_at: 
"2021-02-18 15:26:14.400698000 +0000">, #<Post id: 3, title: 
"テスト3のタイトル", content: "テスト3の内容", created_at: "2021-02-
18 15:26:14.413383000 +0000", updated_at: "2021-02-18 15:26:14.
413383000 +0000">,....(以下省略)

先程seeds.rbで作成した10個のデータが表示されればOKです。

特定の条件のデータを引き出す「where」メソッド

次は作成したダミーデータから、特定の条件にあうデータを引き出してみましょう。ターミナルでコンソール(rails c)を起動したまま、下記コマンドを実行してください。

//Post以降を実行してください
irb(main):002:0> Post.where(title: "テスト1のタイトル")

//実行結果
=> #<ActiveRecord::Relation [#<Post id: 1, title: 
"テスト1のタイトル", content: "テスト1の内容", created_at:
 "2021-02-18 15:26:14.382916000+0000", updated_at: "2021-02-18
 15:26:14.382916000 +0000">]>

10個のダミーデータから、titleが「テスト1のタイトル」のデータが引き出されています。このようにwhereは引数に、引き出したい情報をいれて使用します。

テーブル名.where(カラム名: "任意の文字")

カラム名の値には、「配列」を渡すことも可能です。
コンソールで下記コマンドを実行してください。

irb(main):004:0> Post.where(id: [1,3,6,8])

//実行結果
//Post_idが1,3,6,8のデータを抽出できる

[#<Post id: 1, title: "テスト1のタイトル", content: "テスト1の内容",
 created_at: "2021-02-18 15:26:14.382916000 +0000", updated_at: 
"2021-02-18 15:26:14.382916000 +0000">, #<Post id: 3, title: 
"テスト3のタイトル", content: "テスト3の内容", created_at: 
"2021-02-18 15:26:14.413383000 +0000", updated_at: 
"2021-02-18 15:26:14.413383000 +0000">, #<Post id: 6, 
title: "テスト6のタイトル", content: "テスト6の内容", created_at: 
"2021-02-18 15:26:14.460314000 +0000", updated_at: "2021-02-18 
15:26:14.460314000 +0000">, #<Post id: 8, title: 
"テスト8のタイトル", content: "テスト8の内容", created_at: 
"2021-02-18 15:26:14.472957000 +0000", updated_at: 
"2021-02-18 15:26:14.472957000 +0000">]>

また「where.not」メソッドを使えば、条件に合わないデータを取り出すことも可能です。ターミナルで下記コマンドを実行してみましょう。

irb(main):006:0> Post.where.not(id: [1,2,3,4,5,6,7,8,9])

//実行結果
//Post_idが1,2,3,4,5,6,7,8,9以外のデータを取り出せる

=> #<ActiveRecord::Relation [#<Post id: 10, title: 
"テスト10のタイトル", content: "テスト10の内容", created_at: 
"2021-02-18 15:26:14.490424000 +0000", updated_at: 
"2021-02-18 15:26:14.490424000 +0000">]>

特定のカラムの値のみ取り出す「pluck」メソッド

次は特定のカラムの値のみ取り出してみたいと思います。
ターミナルで下記コマンドを実行してください。

irb(main):007:0> Post.pluck(:id)

//実行結果
//Post_idの値が配列で返ってくる

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

pluckの引数に2つの要素をしてみます。

irb(main):008:0> Post.pluck(:id, :title)

//実行結果
//Post_idとtitleの値が配列で返ってくる
=> [[1, "テスト1のタイトル"], [2, "テスト2のタイトル"],
[3, "テスト3のタイトル"], [4, "テスト4のタイトル"],
[5, "テスト5のタイトル"], [6, "テスト6のタイトル"], 
[7, "テスト7のタイトル"], [8, "テスト8のタイトル"], 
[9, "テスト9のタイトル"], [10, "テスト10のタイトル"]]