7
votes

Rails: Méthode d'appel dans le modèle

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


0 commentaires

4 Réponses :


2
votes

Utilisez un nommé_scope à la place

@date = Model.current


1 commentaires

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.



0
votes

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


1 commentaires

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 filtré '



4
votes

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])


1 commentaires

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



3
votes

La fonction de la classe et de la fonction d'instance est votre problème.

Vous ne pouvez pas appeler une fonction d'instance dans votre fonction de classe de cette façon.

Utiliser self.filter_my_rws Pour définir votre fonction (notez le auto ) et tout ira bien.


0 commentaires