Quelle est la façon la plus propre à remplacer ActiveRecord de trouver pour les deux modèles et collections?
J'ai bibliothèque de code qui remplace Ar la méthode find. J'ai également inclure ce module pour toutes les classes d'Association, donc les deux Monmodèle.trouver et @parent.my_models.trouver du travail et d'appliquer la bonne portée.
J'ai basé mon code de will_paginate:
a = ActiveRecord::Associations
returning([ a::AssociationCollection ]) { |classes|
# detect http://dev.rubyonrails.org/changeset/9230
unless a::HasManyThroughAssociation.superclass == a::HasManyAssociation
classes << a::HasManyThroughAssociation
end
}.each do |klass|
klass.send :include, Finder::ClassMethods
klass.class_eval { alias_method_chain :method_missing, :paginate }
end
Mon problème est que je ne veux remplacer les inventeurs pour certains modèles. Actuellement j'ai besoin de prolonger l'association des classes de collection qui sont partagées par tous les modèles. Je sais que je peux étendre les associations par le modèle par le passage d'un module:
has_many :things, :extend => SomeCustomMethods
Mais ma bibliothèque est fondamentalement suis ActiveRecord plug-in, donc je voudrais un propre convention pour plugable finder extensions qui s'appliquent à la fois le modèle et l'étendue des collections sans affecter tous les modèles de la demande.
OriginalL'auteur ismaSan | 2008-11-24
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez remplacer
find_every
, qui est l'AR de la méthode qui sera finalement exécutéfind_by_sql
avec la requête correspondante. Primordialfind
de ne pas travailler pour personnalisée, des télémètres, et il est juste de plus en plus fragile.Mais pour être compatible avec d'autres plugins que vous ne pouvez pas simplement la surcharge de cette méthode. Au lieu de cela, alias et appellent la mise en place initiale après avoir fait ce que vous voulez:
Cela permettra à votre plugin pour toutes les classes. Comment voulez-vous contrôler les modèles qui sont activés? Peut-être une norme plugin accesseur?
À l'appui de cela, vous devez déplacer le
class << base
à une méthode de classe (doncbase
devrait êtreself
). Comme:OriginalL'auteur Pedro
Tout d'abord, assurez-vous de connaître Ruby appel de la méthode structure d'héritage bien, car sans cela, vous pouvez finir en coup de poignard autour dans l'obscurité.
La façon la plus simple pour ce faire à l'intérieur d'un ActiveRecord classe est:
Qui s'appliquent aux associations ainsi depuis qu'ils utilisent la base de finder eux-mêmes. Maintenant, il vous suffit de faire votre personnalisation. La complexité de qui peut varier largement, et je ne sais pas ce que vous faites donc, je ne peux pas proposer des recommandations.
Aussi de définir dynamiquement sera un exercice en soi, mais cela devrait vous obtenez pointé dans la bonne direction.
OriginalL'auteur gtd
'Pedro réponse est juste, mais il y a une petite erreur.
devrait être
L'aide de la classe << base de ... fin a l'effet de l'appel "s'étendre" sur la "base" dans la classe-la portée de la méthode, mais il n'existe aucune méthode de "base" dans ActiveRecord::Base, alors une erreur est générée. L'aide de base.étendre par lui-même appellera la "prolonger" la méthode de ActiveRecord::Base.
OriginalL'auteur