それぞれの違い
exists?メソッド
指定した条件のレコードがデータベースに存在するかどうか、真偽値で返すメソッド
present?メソッド
レコードの存在確認を行った後に、インスタンスを使って何か処理をしたい時に使用するメソッド
presenceメソッド
オブジェクトが存在すればそのオブジェクトを返し、オブジェクトが存在しなければnilを返すメソッド
exists?メソッド
基本構文
オブジェクト.exists?(条件)
exists?メソッド
の引数に条件を指定すると、条件にマッチするレコードがあればtrue
を返し、レコードがなければfalse
を返します。
指定したidのレコードを確認する方法
pry(main)> User.exists?(1)
=> true
指定した条件のレコードを確認する方法
exists?メソッドの引数にハッシュ(カラム名: '値')を渡します。
pry(main)> User.exists?(name: '田中')
=> true
whereメソッドと併用する方法
pry(main)> User.where(name: '田中').exists?
=> true
present?メソッド
基本構文
オブジェクト.present?
present?メソッドを使用したオブジェクトが存在すればtrueを返し、存在しなければfalseを返すメソッドです。
非常にexists?メソッド
と似通っていて、混乱しそうですね。
使い分けとしては、if文など条件分岐をプログラムで書くときには使われることが多いです。
使用例
app/views/users/index.html.erb
<% if @users.present? %>
<% @users.each do |user| %>
<%= user.name %>
<% else %>
<div>ユーザーなし</div>
<% end %>
<% end %>
presenceメソッド
基本構文
オブジェクト.presence
presenceメソッドを使用したオブジェクトが存在すればそのオブジェクト自身を返し、存在しなければnilを返すメソッドです。
presenceメソッドはRailsのメソッドなので、Rubyで使おうとすると、エラーが出ます。
使用例
app/model/user.rb
class User < ApplicationRecord
def call
name.presence || 'No Name'
end
end
app/controller/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.call
end
end
app/views/users/show.html.erb
<%= @user %>
このように記載すると、@userのnameに値があればその値が表示され、なければ “No Name” と表示されます。
おわりに
とてもややこしいですね。
自分でまとめておきながら、混乱しています。
徐々に使っていって、手で覚えるしかないですね。