Rails つまみぐい

Rails つまみぐい

Ruby on Rails 初学者による行き当たりばったりなメモ

modelクラスの中でのselfの使い方


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