LoginSignup
6
3

More than 5 years have passed since last update.

【rails5】findメソッドとfind_byのメソッドの違い

Last updated at Posted at 2018-12-13

findメソッドとfind_byメソッドの違いで躓いたため、メモしておきます。

findメソッドはidによって値を取得する。

findの検索条件はidのみ。複数のidを取得出来る。

railsには、 デフォルトで「id」カラムがプライマリキーとしてデータベースに追加されるため、何も設定することなくfindメソッドを使える。

基本形
モデル名.find(引数)
引数には、数値型,文字列の数字,数字のリスト,数字の配列を指定できる。
使い方
User.find(1) Userテーブルの中から、idが1のユーザーを返す

find_byは特定の条件にマッチした最初の値を取得する。

find_byメソッドは1つしか値を取得出来ない。複数の条件で検索出来る。

(複数の値を特定の条件で取得したい場合は、whereメソッド)

使い方

Userテーブルの中から、nameカラムがmasaruとマッチした最初のデータを取得する。
User.find_by(name: 'masaru')
Userテーブルの中から、nameから、nameカラムがmasaruかつ、管理者(adminがtrue)である最初のデータを取得する。
User.find_by(name: 'masaru', admin:true) 
Userテーブルの中から、作成日が1週間以内のデータを取得する。
User.find_by("created_at > ?", 1.week.ago) 

上記findメソッドを使って実現したいこと

【管理者としてログインし、ユーザー一覧から一般ユーザーの各ページに飛べるようにする】

showアクションで、find_byメソッドを使っていたので、一般ユーザーのidが取得出来ていなかった。

users_controller
@user = User.find_by(params[:id])

では、一人のユーザーidしか取得できない。

つまり、

【管理者としてログインしてから、一般ユーザーの各ページに飛ぶ、という事が出来ない】(管理者自身もid1を持っているので、値を取得するための枠がない)

これを実現するには、複数の値を取得出来るよう、findメソッドを使う必要があった。

users_controller
def show
@user = User.find(params{:id])

に修正。

これで管理者ユーザーでログインしてからでも一般ユーザーのidが取得でき、各ユーザーの基本時間やプロフィールの編集が出来るようになりました!

findとfind_byの違いまとめ

検索条件の違い
findの検索条件はidのみ、複数のidを取得出来る。
find_byは複数の条件を指定したり、id以外でも検索出来るが、取得できる値は、最初にマッチした1件のみ。

エラー時の違い
findメソッドは例外を発生させる
find_byはnilを返す

その他

railsのfindとrubyのfindは全く違う。

rubyのfindは、検索条件に一致した最初の1つ目の要素だけを返す。

rubyのfind_allは検索条件に一致した全ての要素を返す。selectも全く同じメソッド。

any?メソッドは配列の中に条件に一致しているものが一つでもあれば、trueを返し、1つも含まれていないならfalseを返す。

参考
findとfind_byの違い

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3