在rails中,我如何委托给一个类方法

class Task  Date.today.beginning_of_week..Date.today.end_of_week) end end class Important  :taskable, :dependent => :destroy delegate this_week, :to => :task end 

到目前为止,当我尝试Important.this_week时,这个代表没有按预期工作。 我得到一个错误,说没有为类定义this_week方法…

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

您正在获取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 

考虑inheritance,将方法委托给类方法:

 delegate :this_week, :to => :class 

你可以委托给一个特定的类(参见Isaac Betesh的回答):

 delegate :this_week, :to => :Task 

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

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

 class Important < ActiveRecord::Base delegate :this_week, :to => :Task # Note ':this_week' instead of 'this_week' # Note 'Task' instead of 'task' end