34
class Task < ActiveRecord::Base
  attr_accessible :due_date, :text

  def self.this_week
    where(:due_date => Date.today.beginning_of_week..Date.today.end_of_week)
  end
end

class Important < ActiveRecord::Base
  attr_accessible :email

  has_one :task, :as => :taskable, :dependent => :destroy

  delegate this_week, :to => :task
end

到目前为止,当我尝试Important.this_week. 我收到一条错误消息,说没有this_week为类定义方法...

有任何想法吗?我什至可以委托给这样的类方法吗?我可能有一两个Task以这种方式扩展的类,所以我很好奇它是如何以一种不会将一堆代码复制到每个实现类的方式工作的。

4

3 回答 3

38

您正在选择ActiveSupport 委托核心扩展。帮助器为当前类delegate定义了一个实例方法,以便它的实例将调用委托给该实例上的某个变量。

如果要在类级别进行委托,则需要打开单例类并在那里设置委托:

class Important < ActiveRecord::Base
  attr_accessible :email

  has_one :task, :as => :taskable, :dependent => :destroy

  class << self
    delegate :this_week, :to => :task
  end
end

但这假设这Important.task是对类的引用Task(它不是)

而不是依赖委托助手,这只会让你的生活变得困难,我建议在这里显式代理:

class Important < ActiveRecord::Base
  attr_accessible :email

  has_one :task, :as => :taskable, :dependent => :destroy

  class << self
    def this_week(*args, &block)
      Task.this_week(*args, &block)
    end
  end
end
于 2013-01-28T18:09:35.583 回答
31

将方法委托给类方法,考虑继承:

delegate :this_week, :to => :class

您可以像这样委托给特定的班级(另请参阅 Isaac Betesh 的回答):

delegate :this_week, :to => :Task

文档可在此处获得: http: //api.rubyonrails.org/classes/Module.html#method-i-delegate

于 2015-05-06T09:38:44.470 回答
12

您可以将一个方法委托给一个常量——它只是区分大小写。此外,方法的名称必须delegate作为符号传递给。

class Important < ActiveRecord::Base
  delegate :this_week, :to => :Task
  # Note ':this_week' instead of 'this_week'
  # Note 'Task' instead of 'task'
end
于 2014-08-10T19:35:53.537 回答