J'ai un modèle comme suit:Comment puis-je étendre un objet renvoyé à partir d'une association ActiveRecord lors de l'exécution?
class Property < ActiveRecord::Base
has_and_belongs_to_many :property_values
end
Ce que je voudrais faire est d'étendre toute valeur retournée par une découverte sur l'extension property_values avec un module qui est déterminé par un attribut de l'objet de la propriété. Je l'ai essayé quelque chose comme ceci:
class Property < ActiveRecord::Base
has_and_belongs_to_many :property_values, :extend => PropertyUtil::Extensible
def enrich(to_extend)
modules.split(/\s*,\s*/).each do |mod|
to_extend.extend(Properties.const_get(mod.to_sym))
end
end
end
module PropertyUtil
module Extensible
def self.extended(mod)
mod.module_eval do
alias old_find find
end
end
def find(*args)
old_find(*args).map{|prop| proxy_owner.enrich(prop)}
end
end
end
Lorsque tous les modules qui peuvent être sélectionnés sont définis dans le module Propriétés. En essayant de fonctionner avec ce code, cependant, il y a quelques problèmes; d'abord, à ma grande surprise, aucun des finders dynamiques (property_values.find_by_name, etc.) ne semble déléguer à find; Deuxièmement, quelque chose avec la façon dont j'ai fait l'aliasing conduit à un dépassement de pile lorsque j'essaie de lancer la recherche directement.
Existe-t-il un moyen de faire ce que je tente? Quelle méthode puis-je alias et redéfinir de sorte que tous les résultats retournés par l'extension d'association, indépendamment de la façon dont ils sont récupérés, sont étendus avec les modules appropriés?
Merci, Kris
Il y a after_find et after_initialize callbacks que vous pouvez définir, mais il n'y a pas vraiment recommandé, car il provoque un grand succès de la performance. – jemminger