在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