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の違いを表にまとめました。
find | find_by | find_each | |
---|---|---|---|
機能 | レコード検索 | レコード検索 | イテレーター(繰り返し処理) |
検索条件 | idのみ | カラム指定可 | - |
取得データ数 | 複数取得可 | 1件のみ | - |
検索結果がない場合 | 例外 | nil | - |
findメソッドと同じように、レコード検索機能を持つwhereメソッドはこちらにまとめています。
findの使い方まとめ
findメソッドはデータベースからレコードを検索する機能です。
ココがポイント
findはidのみ指定で複数取得可
find_byはid以外にカラムを指定で1件のみ取得
find_eachは検索ではなく繰り返し処理
似ているものにfind_byとfind_eachがありますが、それぞれ違う動きをするので、用途に合わせて使用しましょう。
findとfind_byは必ずと言っていいほどよく使うメソッドなのでマスターしましょう!