存在するかを確認できるexists?、present?、presenceメソッド
exists?メソッド
レコードの存在チェックだけを行う場合に使用する。
例えば
モデル名.exists?
でデータベースのテーブルの中にデータが存在するかを確認し、真偽をtrue,false で返してくれる。
また、
モデル名.exists?(条件)
にすると指定した条件でマッチするか確認し真偽を返してくれる。
条件にはテーブルのidや値を入れることもできる。
Purchase.exists?(3)
Purchase.exists?(item_id: @item.id)
present?メソッド
レコードの存在チェックを行った後にインスタンスを使って何か処理をする場合に使用する。
例えば
if @item.purchase.present?
のようにインスタンスを使う場合。
exists?とpresent? は似ていてインスタンスを使うかどうか以外は同じような挙動をしていると思う。
presenceメソッド
present?メソッドがtrueの時、レシーバ自身を返し、 false のときは nil を返してくれる。
例えば
pry(main)> Item.find(1).present?
Item Load (0.6ms) SELECT `items`.* FROM `items` WHERE `items`.`id` = 1 LIMIT 1
=> true
[18] pry(main)> Item.find(1).presence
Item Load (0.5ms) SELECT `items`.* FROM `items` WHERE `items`.`id` = 1 LIMIT 1
=> #<Item:0x00007fed38fe7540
id: 1,
item_name: "A",
item_text: "A",
category_id: 4,
condition_id: 3,
shipping_id: 2,
sender_id: 3,
delivery_date_id: 3,
price: 1000,
user_id: 1,
created_at: Thu, 10 Dec 2020 16:38:34 UTC +00:00,
updated_at: Thu, 10 Dec 2020 16:38:34 UTC +00:00>
というようにそのまま中身を返してくれるもの