今日は、レシーバがインスタンスを複数含む場合、適用させるメソッドはどこにどのような形で書くべきか迷ったことがあり、クラスメソッドとインスタンスメソッドの違いを確認しました。
インスタンスメソッド
インスタンスメソッドは、モデルの各インスタンスに関連付けられています。
つまり、特定のデータベースレコード(モデルのインスタンス)に対して呼び出すことができます。
インスタンスメソッド内で、self キーワードを使ってインスタンス自体を参照できます。
インスタンスメソッドは、インスタンスごとに異なるデータを操作できます。
class User < ApplicationRecord def full_name "#{self.first_name} #{self.last_name}" end end user = User.new(first_name: "John", last_name: "Doe") user.full_name # インスタンスメソッドを呼び出す
クラスメソッド
クラスメソッドは、モデル自体に関連付けられており、特定のインスタンスに依存せず、クラス全体に対して操作を提供します。
クラスメソッド内で self キーワードを使用すると、クラス自体を指すことができます。
クラスメソッドは特定のインスタンスの状態にアクセスできないため、データベースレコードに依存しない操作に使用されます。
class User < ApplicationRecord def self.find_admins where(role: 'admin') end end admins = User.find_admins # クラスメソッドを呼び出す
モデル内のメソッドとクラスメソッドは、異なるコンテキストや使用ケースに応じて使用されます。
インスタンスメソッドは個々のデータレコードに対する操作に適しており、クラスメソッドはデータベーステーブル全体に対する操作や、特定のデータセットを返すクエリメソッドなど、インスタンスに依存しない操作に適しています。