ne peut pas comprendre celui-ci. Dans le modèle Rails, je souhaite appeler une méthode dans le même modèle pour manipuler les données renvoyées par une méthode de recherche. Cette méthode de «filtrage» sera appelée à partir de nombreuses méthodes de recherche personnalisées dans ce modèle. Je souhaite donc que ce soit séparé. (Et je ne peux pas filtrer de la SQL, il est trop compliqué)
Voici un exemple: P>
#controller @data = Model.find_current #model class Model def self.find_current @rows = find(:all) filter_my_rows return @rows end def filter_my_rows #do stuff here on @rows for row in @rows #basically I remove rows that do not meet certain conditions end end end
4 Réponses :
Utilisez un nommé_scope à la place
@date = Model.current
Merci, mais je pense que je ne peux pas utiliser de portée ou de filtrage de condition pour le SQL car les conditions que j'ai besoin de vérifier provient des données de différentes bases de données (sur différents serveurs). Donc, je dois les faire boucler et les vérifier une par une, la tressée de l'association d'appartenance elle-même.
Quel est le problème avec vos solutions? Que cherchez-vous exactement? Si j'ai compris votre point de vue, le principal problème de votre implémentation est que
Cette méthode "filtrant" sera appelée de nombreuses méthodes de recherche personnalisées dans ce modèle, donc je veux que ce soit séparé. p> blockQuote>
... que vous ne pouvez pas utiliser nommé_scopes ou avec_scope, la première solution qui me vient à mon esprit est de créer un wrapper personnalisé pour agir en tant que filtre. P>
class Model def self.find_current filtered do all end end def self.other_method filtered do all :conditions => { :foo => "bar" } end end def self.filtered(&block) records = yield # do something with records records end end
Ce qui ne va pas avec ma méthode est que cela me donne cette erreur: méthode indéfinie filtre_my_rows '. Tout comme si cela n'était pas capable de comprendre que j'essaie d'appeler une méthode de l'intérieur en soi. Votre méthode me donne également la même erreur: méthode non définie code> filtré '
Une partie du problème est que vous définissez une méthode de classe appelée Find_Current et une méthode d'instance appelée filtre_my_rows. Généralement, vous les définissez à la fois dans la même portée de travailler ensemble.
Une autre chose est que vous pouvez faire beaucoup de filtrage dont vous avez besoin avec un tableau simple # Rejeter appel. Par exemple: P>
# Define reusable blocks that are organized into a Hash CONDITION_FILTERS = { :current => lambda { |m| m.current } } # Array#select is the inverse of Array#reject @models = all.select(CONDITION_FILTERS[:current])
Cela a travaillé pour moi en partie. Je ne comprends pas complètement Lambda, je vais devoir lire dessus, mais la méthode de rejet sera assez utile pour éliminer les lignes de la matrice de recherche. Merci
La fonction de la classe et de la fonction d'instance est votre problème. p>
Vous ne pouvez pas appeler une fonction d'instance dans votre fonction de classe de cette façon. P>
Utiliser self.filter_my_rws code> Pour définir votre fonction (notez le
auto code>) et tout ira bien. P>