modelクラスの中でのselfの使い方
Ruby on Rails v3.2.11
modelクラスの中でのselfの使い方です。railsのルールというよりはrubyのルールですが、modelの中でselfを使うときに時々不安になるのでメモっておきます。
クラスメソッドとインスタンスメソッド
modelクラスの中でメソッドを定義する際に、メソッド名の頭にself.をつけるとクラスメソッド、つけないとインスタンスメソッドになります。
class User < ActiveRecord::Base def hoge #インスタンスメソッド end def self.hoge #クラスメソッド (def User.hoge とやっても同じ意味) end end
ちなみに使い分けですが、インスタンスメソッドはそれぞれのインスタンスに対して参照・更新するようなメソッドとして使います。一方クラスメソッドは、modelクラスのレコードを検索するとか、作成されたインスタンスの数をカウントするとか、クラスの新しいインスタンスを作る等、個々のインスタンスには紐づけずクラスに対して働きかけるメソッドになります。
メソッド内でselfを使う場合
クラスメソッド内でselfを使うとクラスを指し、インスタンスメソッド内でselfはそのインスタンスになります。リーズナブルですね。
class User < ActiveRecord::Base def hoge #インスタンスメソッド end def self.hoge #クラスメソッド end def page #インスタンスメソッド self.hoge #インスタンスメソッドのhogeが呼ばれる hoge #インスタンスメソッドのhogeが呼ばれる self.class.hoge #こうするとクラスメソッドのhogeを呼べる end def self.page #クラスメソッド self.hoge #クラスメソッドのhogeが呼ばれる hoge #クラスメソッドのhogeが呼ばれる end end
ちなみにクラスメソッドを class << self の中で定義することもできるので、クラスメソッドとインスタンスメソッドがいくつも入り乱れるときは、下のように書く方が見通しがいいかもしれません。
class User < ActiveRecord::Base def hoge #インスタンスメソッド end def page #インスタンスメソッド end class << self def page #クラスメソッド end def hoge #クラスメソッド end end end