2010-03-01 4 views
2

Je veux trouver une liste ordonnée de coureurs en fonction de leurs résultats.Enregistrement actif: recherche de références et également retour de

modèles

class Race < ActiveRecord::Base 
has_many :runners, :dependent => :destroy 
end 

class Runner < ActiveRecord::Base 
    belongs_to :race 
    has_one :result, :dependent => :destroy 
end 

class Result < ActiveRecord::Base 
    belongs_to :runner 
end 

essayer d'utiliser quelque chose comme ça

ordered_runners = race.runners.all(:include => :result, :order => 'results.position ASC') 

position est leur position finale à savoir [1,2,3,4 ....]

mais si un résultat est manquant (nul) alors le coureur n'est pas inclus. Y a-t-il un moyen de le faire et de renvoyer tous les coureurs?

acclamations

Répondre

3

Les coureurs sans résultats ne sont pas inclus parce :include apporte seulement dans les données réduisant au minimum le nombre de requêtes pour éviter N + 1 résultats à la db. Vous voulez faire un :join externe pour inclure tous les coureurs, peu importe s'ils ont un résultat ou non.

ordered_runners = race.runners.all(:joins => "left outer join results on runners.id = results.runner_id", :order => 'results.position ASC') 

Vérifiez ce code en fonction de vos noms de colonne/table de migration et de votre base de données.

-1

Cela devrait retourner les coureurs avec un résultat nul:

race.runners.all(:include => :result, :conditions => "results IS NULL", :order => 'results.position ASC') 
Questions connexes