はじめに
Active Recordのオブジェクトが新規作成されたものか、既存のデータベースのレコードから読み込まれたものかを判別する必要があったため調べてみました。
このような場合、new_record?
メソッドが非常に役立ちます。本記事では、new_record?
メソッドの基本的な使い方と、特定のコンテキストでのレシーバーなしでの使用について解説します。
new_record?
メソッドとは
new_record?
はActive Recordのインスタンスメソッドであり、オブジェクトがデータベースにまだ保存されていない新規レコードである場合にtrue
を返します。つまり、new
メソッドや関連するビルダーメソッドによってオブジェクトが作成され、まだsave
が呼び出されていない状態を示します。
主な使い方
user = User.new(name: "Taro")
user.new_record? # => true
user.save
user.new_record? # => false
この例では、最初にUser
モデルの新規オブジェクトを作成した時点でnew_record?
はtrue
を返します。これは、オブジェクトがまだデータベースに永続化されていないことを意味します。save
メソッドを呼び出してオブジェクトがデータベースに保存されると、new_record?
はfalse
を返すようになります。
レシーバーなしでの使用について
Active Recordのコールバックやバリデーションの定義内でunless new_record?
のようにレシーバーなしでnew_record?
を使用することができます。これは、これらのコンテキスト内では現在のオブジェクト(self
)が自動的にレシーバーとして扱われるためです。
class Post < ApplicationRecord
before_save :do_something_unless_new_record
private
def do_something_unless_new_record
unless new_record?
# 何らかの処理...
end
end
end
この例では、before_save
コールバック内でunless new_record?
が使用されています。これはself.new_record?
の短縮形であり、現在のPost
インスタンスが新規レコードでない場合に限り、特定の処理を実行することを意味します。
まとめ
new_record?
メソッドは、Active Recordのオブジェクトの状態を理解し、条件に応じた処理を実装する際に非常に便利です。コールバックやバリデーション内でレシーバーなしで使用できるのは、Rubyに設定されている、現在のコンテキスト内のself
が暗黙のレシーバーとして機能するためです。
参考記事