2010-04-25 4 views
2

Supposons que j'ai trois modèles: Student, SchoolClass et DayOfWeek. Il existe une relation HABTM entre Student et SchoolClass, et entre SchoolClass et DayOfWeek. Ce que je voudrais faire, c'est trouver toutes les classes d'école appartenant à un étudiant donné qui se rencontrent le lundi.Ruby on Rails: Comment trouver tous les éléments avec un hachage contenant une valeur spécifique

Maintenant, je suppose que je pouvais faire quelque chose comme:

@student = Student.find(:student_id) 
@student_classes = @student.school_classes.find(:all) 
@student_classes_on_monday = Array.new 
@student_classes.each do |student_class| 
    if student_class.day_of_week.include?("Monday") 
    @student_classes_on_monday << student_class 
    end 
end 

Est-il possible d'accomplir des lignes 2-8 dans une seule méthode de recherche?

Répondre

4

On dirait que vous voulez utiliser select:

@student_classes_on_monday = @student_classes.select do |student_class| 
    student_class.day_of_the_week.include? "Monday" 
end 

Sélectionnez retournera tous les éléments pour lesquels le bloc est vrai. Donc, vous pouvez simplement passer votre condition en tant que bloc et récupérer les éléments qui répondent aux critères.

Vous pouvez également utiliser le mot-clé 'like' pour essayer de faire correspondre cela dans votre requête de base de données. Je ne suis pas positif ce que votre schéma est comme, mais quelque chose comme cela pourrait vous aider à démarrer:

@student.school_classes.find(:all, :conditions => ['day_of_week LIKE ?', '%Monday%']) 

Je suis un peu rouillé sur la syntaxe pour moi-même, donc je tire cet exemple d'ici (et donc ne garantira pas qu'il est totalement correct): http://railsruby.blogspot.com/2006/08/like-as-condition-to-get-records.html

+0

C'est plus élégant, mais ce que j'aimerais vraiment, c'est une méthode find_all_by qui retourne seulement les classes recherchées. Je vais mettre à jour ma question pour être spécifique à ce point. – kingjeffrey

+0

essayé de donner un petit aperçu dans une requête de recherche qui pourrait faire ce que vous voulez. Je ne sais pas si c'est exactement ce dont vous avez besoin. – Pete

+0

Merci Pete. Si votre deuxième bit ne fonctionne pas pour moi, la première volonté. – kingjeffrey

Questions connexes