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)

我想我更喜欢 wrapper 方法,因为我可以给它一个任意别名(尽管如果我使用 rtfm 也可以使用委托)。这里还有其他事情吗?(我似乎无法根据委托键进行查询)

4

1 回答 1

3

两者或多或少是等价的,唯一的区别是一点点异常处理代码,让您知道您是否委托给一个nil对象。要使用您的示例,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 回答