getters personnalisés dans Ruby on Rails
-
21-09-2019 - |
Question
J'ai un modèle listserver has_may: les
Pour la plupart de ma demande, je veux seulement amener les gens qui sont actifs
Alors @mailing_list.people
ne doit renvoyer des personnes qui sont actives
Dans mon modèle, je ne peux pas faire
def people
self.people.find_all{ |p| !p.activated_at.nil? }
end
parce que garde se fait appeler. Quel est le rubis / rails moyen de filtrer automatiquement les personnes. Une autre question possible est que je pense que self.people retourne un tableau d'objets d'enregistrement actif où self.people.find_all...
retourne un tableau. Cela entraînera une partie de mon code à briser. Il est facile, mais est fixe il un moyen de retourner des objets record actifs? Il serait agréable d'avoir l'option.
Merci!
La solution
Vous pouvez également filtrer au niveau de l'association.
has_many :people, :conditions => {:activated => true}
Autres conseils
Ceci est un exemple parfait pour un champ nommé:
class Person < ActiveRecord::Base
named_scope :active, :conditions => 'activated_at is not null'
end
Ensuite, il suffit l'appeler:
# equivalent to Person.find(:all, :conditions => 'activated_at is not null')
@active_people = Person.active
Vous pouvez utiliser la méthode de recherche standard ou un viseur dynamique. Votre découverte pourrait se lire comme suit:
people.find (: all,: conditions => "activated_at = néant") OU people.find_all (: conditions => "activated_at = nil")
Une version dynamique de ce qui pourrait se lire comme:
people.find_by_activated_at (néant)