メッセージを委譲する

あるオブジェクトがメッセージを受け取った(メソッドが呼び出された)とき、実際の処理を他のオブジェクトに委ねることを“委譲(delegate)”と呼びます。RailsではModuleクラスのdelegateメソッド*1によって、委譲を簡単に実現することができます。

class BranchOffice
  attr_accessor :head_office

  delegate :address, :main_switchboard, :to => "@head_office"
end

delegateに続いて委譲したいメソッドを列挙し、最後に移譲先となるオブジェクトを:toで指定します。このとき、移譲先となるオブジェクトを文字列で指定するのがポイントです。この文字列はメソッド定義に利用されるので、オブジェクトを返せば任意のコードを書くことができます。

class User
  belongs_to :account

  delegate :nickname, :gender, :age :to => "account"
end

関連を使って、関連先のオブジェクトに委譲することもできます。

*1:ClassクラスはModuleクラスを継承しているので、delegateメソッドはすべてのクラス定義で使えます。