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
到目前为止,当我尝试时,这个代表没有按预期工作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
但这假设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
And*_*art 18
考虑继承,将方法委托给类方法:
delegate :this_week, :to => :class
你可以委托给一个特定的类(参见Isaac Betesh的回答):
delegate :this_week, :to => :Task
文档可在此处获取: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
| 归档时间: | 
 | 
| 查看次数: | 15546 次 | 
| 最近记录: |