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

pet*_*erw 21 ruby-on-rails ruby-on-rails-3

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
Run Code Online (Sandbox Code Playgroud)

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

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

Nev*_*vir 29

您正在获取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
Run Code Online (Sandbox Code Playgroud)

但这假设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
Run Code Online (Sandbox Code Playgroud)


And*_*art 18

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

delegate :this_week, :to => :class
Run Code Online (Sandbox Code Playgroud)

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

delegate :this_week, :to => :Task
Run Code Online (Sandbox Code Playgroud)

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


Isa*_*esh 10

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

class Important < ActiveRecord::Base
  delegate :this_week, :to => :Task
  # Note ':this_week' instead of 'this_week'
  # Note 'Task' instead of 'task'
end
Run Code Online (Sandbox Code Playgroud)