Dans les rails comment déléguer à une méthode de classe

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

jusqu'à présent, ce délégué ne fonctionne pas comme prévu, quand j'ai essayer Important.this_week. J'obtiens un message d'erreur disant qu'il y a pas de méthode this_week défini pour la classe...

des idées? Je peux même déléguer à une méthode de classe comme ça? J'ai peut-être une autre classe ou deux étendant Task de cette façon, donc je suis curieux de savoir comment cela fonctionne d'une manière qui ne duplique pas un tas de code à chaque classe d'implémentation.

18
demandé sur Nakilon 2013-01-28 21:59:36

3 réponses

Vous allez chercher les ActiveSupport délégation extension du coeur. delegate helper définit un exemple méthode pour la classe courante afin que les instances de celle-ci délèguent des appels à une variable sur exemple.

Si vous souhaitez déléguer au niveau de la classe, vous devez ouvrir la classe singleton et configurer la délégation:

class Important < ActiveRecord::Base
  attr_accessible :email

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

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

Mais cela suppose que Important.task est une référence à l' Task classe (ce qui ne l'est pas)

au lieu de compter sur l'aide de la délégation, ce qui va juste vous rendre la vie difficile, je vous suggère de vous adresser explicitement ici:

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
29
répondu Nevir 2013-01-28 18:09:35

déléguer une méthode à une méthode de classe, en considérant l'héritage:

delegate :this_week, :to => :class

vous pouvez déléguer à une classe spécifique comme so (voir aussi la réponse D'Isaac Betesh):

delegate :this_week, :to => :Task
http://api.rubyonrails.org/classes/Module.html#method-i-delegate

12
répondu Andreas Baumgart 2015-05-06 09:38:44

Vous pouvez déléguer une méthode à une constante, c'est juste sensible à la casse. Aussi, le nom de la méthode doit être transmis à delegate comme un Symbole.

class Important < ActiveRecord::Base
  delegate :this_week, :to => :Task
  # Note ':this_week' instead of 'this_week'
  # Note 'Task' instead of 'task'
end
8
répondu Isaac Betesh 2014-08-10 19:35:53