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.
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
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
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