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?

Ruby on Rails: `new_record?`メソッドの活用(レシーバなし含む)

Last updated at Posted at 2024-03-06

はじめに

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が暗黙のレシーバーとして機能するためです。

参考記事

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?