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を返す。