1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

find,find_byメソッド 違い

Last updated at Posted at 2020-06-14

findについて

findメソッドはidによってデータを取得します。
Railsでは、デフォルトでidカラムがプライマリキーとしてデータベースに追加されているため、自分で設定することなく、findメソッドを使用できます。

構文

モデル名.find(引数)

指定できる引数は、

  • 数値型
  • 文字列の数字
  • 数字のリスト
  • 数字の配列

以上
4つです。

(例)blogの詳細画面を実装したい場合

blogs_controller.rb
class BlogsController < ApplicationController
  # 省略
  def show
    @blog = Blog.find(params[:id])
  end
  # 省略
end

blogの情報(詳細)を取得するために、「findメソッドの引数にどのblogのidを渡せば良いのか」、「どのidのblogの詳細画面を開きたいのか」を教えてあげる必要があります。

この例では、paramsメソッドとfindメソッドを使用して、画面から取得したblog情報を変数に代入しています。

アクションが起動すると、parameterでblogのidが送られてくるようになっています。

find_byについて

特定の条件にマッチした最初のレコードを検索します。
取得するデータは一件です。

構文

モデル名.find_by(特定の条件)

指定できる引数は、

  • カラム名
  • 検索条件

などです。データが見つからない場合はnilを返します。

(例)find_byメソッドがnilを返す特性を生かし、以下のように条件分岐が可能

#省略
<% unless @blog.user_id == current_user.id %>
  <% if @favorite.present? %>
    <%= link_to 'お気に入り解除する', favorite_path(id: @favorite.id), method: :delete, class: 'btn btn-danger' %>
  <% else %>
    <%= link_to 'お気に入りする', favorites_path(blog_id: @blog.id), method: :post, class: 'btn btn-primary' %>
  <% end %>
<% end %>
# 省略

このように、お気に入り登録がされていなければ、お気に入りするボタンを表示させ、お気に入り登録されていば、お気に入りを解除するボタンを表示させることができます。

まとめ

  • findは、検索条件として指定できるのは、idのみ
  • find_byは、複数の条件を指定したり、id以外のカラムでも検索できる
  • findは、データを複数取得できる
  • find_byは、最初にマッチした一件のみ取得できる
  • findは、検索結果がない場合、例外を発生させて処理を中断する
  • find_byは、検索結果がない場合、nilを返すため、処理は中断されない
1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?