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を返すため、処理は中断されない