1

代行するメリットは?便利な方法以外に追加の理由はありますか?モデル内の単純なラッパー メソッドと比べてどうですか?

デリゲートがなければ、次のようになります。

Class Goal
  belongs_to :user
end

 Time.now.in_time_zone(goal.user.timezone)

デリゲートを使用すると、次の利点があります。

Class Goal
  belongs_to :user
  delegate :timezone, :to => :user

  ...
end

Time.now.in_time_zone(goal.timezone)

対ラッパーメソッド:

Class Goal
  belongs_to :user
  def tz
    self.user.timezone
  end

  ...
end

Time.now.in_time_zone(goal.tz)

任意のエイリアスを付けることができるので、ラッパー メソッドを好むと思います (ただし、rtfm を使用する場合は、デリゲートでも可能である可能性があります)。ここで他のことが起こっていますか?(委任されたキーに基づいてクエリを実行できないようです)

4

1 に答える 1

3

nilこの 2 つはほぼ同等です。唯一の違いは、オブジェクトに委譲しているかどうかを知らせる例外処理コードが少しあることです。あなたの例を使用するには、delegate :timezone, :to => :userこのタイムゾーンメソッドを生成します:

def timezone(*args, &block)
  user.__send__(:timezone, *args, &block)
rescue NoMethodError
  if user.nil?
    raise "Goal#timezone delegated to user.timezone, but user is nil: #{self.inspect}"
  else
    raise
  end
end

任意のエイリアスを使用することはできませんが、prefix. このallow_nilオプションを使用して、デリゲート オブジェクトがnil.

詳細については、delegateドキュメントまたはdelegateソース コードを参照してください。

于 2012-09-11T20:52:07.843 に答える