プログラミング

【Rails】findの使い方(find_by find_eachも紹介)

Ruby on Rails findの使い方


初心者

railsを始めてみたけどfindってどう使う?
オブジェクトを検索したい時はどうすればいい?


こんなお悩みに答えます。

記事の信頼性

当サイトの管理者「つげお」は、プログラミング未経験からWeb業界でプログラマー(Ruby on Rails)として6年勤務しています。

Ruby on Railsでは、ActiveRecordという機能によってDB(データベース)内のデータを検索することができます。

ただ、Railsには似たようなメソッドが多いため、「何が違うのか」「どれを使えばいいのか」分かりづらいですよね。

そこで、本記事では、Railsのfind/find_by/find_eachメソッドについて使い方を解説しています。

findメソッドの使い方

虫眼鏡

findメソッドは指定したidのデータを検索するメソッドです。

以下、Userモデルを例に説明していきます。

findの基本形

findメソッドの基本形は「モデル名.find(id)」となります。

検索したいモデルにfindを繋げて使います。findの引数(カッコの中の部分)には、検索したいidを指定しましょう。

 
User.find(3)

上記は「Userテーブルの中でidが3のレコードを検索」という意味になります。
※id(プライマリーキー)の重複はないので、検索結果は1つだけになります

なお、ヒットするidのレコードが見つからない場合は、例外(RecordNotFound)が発生します。

findで複数のidを指定する

idを複数指定してレコードを取り出すことも可能です。

以下のようにidを,(カンマ)で区切って指定するか

 
User.find(1,3,5)

idを配列([]でくくる)で指定すると

 
User.find([1,3,5])

指定したidにヒットしたレコードを配列で返してくれます。

この場合は、「Userテーブルの中でidが1と3と5のレコード」を返します。

find_byメソッドの使い方

虫眼鏡を覗く女性

find_byメソッドは指定したカラムの値に合致する最初のデータを検索するメソッドです。
※find_byは1件のみ返します

以下、Userモデルを例に説明していきます。

find_byの基本形

find_byメソッドの基本形は「モデル名.find_by(カラム名: 値)」となります。

検索したいモデルにfind_byを繋げて使います。find_byの引数(カッコの中の部分)には、検索したいカラムと値を指定しましょう。

 
User.find_by(name: "テスト太郎")

上記は「Userテーブルの中でnameがテスト太郎のレコードの最初の1件を検索」という意味になります。

なお、ヒットするレコードが見つからない場合は、nilが返ります。

find_byの複数条件検索

find_byの引数に複数の条件を指定することも可能です。

以下のようにカラムと値のhashを,(カンマ)で区切って指定できます。

 
User.find_by(name: "テスト太郎", age: 20, email: "test-taro@test.jp")

上記は「Userテーブルの中で「nameがテスト太郎」かつ「ageが20」かつ「emailがtest-taro@test.jp」のレコードの最初の1件を検索」という意味になります。

find_byの含み検索

Stringのカラムを指定する場合、指定した文字列を含むレコードを検索することができます。

以下のようにlikeを使って含み検索ができます。

 
User.find_by("name like '%テスト%'")

上記は「Userテーブルの中で「nameに"テスト"を含む」レコードの最初の1件を検索」という意味になります。

find_byの不等号検索

日付や数字の大小を検索する場合、不等号を使ってレコードを検索することができます。

 
User.find_by("created_at > ?", Date.tomorrow)

上記は「Userテーブルの中で「created_atが本日以前の」レコードの最初の1件を検索」という意味になります。

find_eachメソッドの使い方

本の繰り返し

find_eachは、find・find_byとは全く違う動きをするメソッドです。

find・find_byはレコードを検索するメソッドですが、find_eachは繰り返し処理を行うメソッドとなります。

繰り返しといえばeachですが、find_eachは1000件ずつデータを読み込んで繰り返すメソッドです。

ビッグデータを処理するときに役立ちます。

 
User.find_each do |user|
  p user.name
end

上記は「Userテーブルのレコードを1000件ずつ取り出し、そこから1つずつユーザ名を表示する」という意味になります。

find・find_by・find_eachの違い

カラフルなふせん

これまで紹介した、findとfind_byとfind_eachの違いを表にまとめました。

findfind_byfind_each
機能レコード検索レコード検索イテレーター(繰り返し処理)
検索条件idのみカラム指定可-
取得データ数複数取得可1件のみ-
検索結果がない場合例外nil-

findメソッドと同じように、レコード検索機能を持つwhereメソッドはこちらにまとめています。

findの使い方まとめ

END 終わり

findメソッドはデータベースからレコードを検索する機能です。

ココがポイント

findはidのみ指定で複数取得可

find_byはid以外にカラムを指定で1件のみ取得

find_eachは検索ではなく繰り返し処理

似ているものにfind_byとfind_eachがありますが、それぞれ違う動きをするので、用途に合わせて使用しましょう。


つげお

findとfind_byは必ずと言っていいほどよく使うメソッドなのでマスターしましょう!


-プログラミング
-

Copyright© つげコード , 2020 All Rights Reserved.