2013-05-03 2 views
2

J'essaie de faire une requête plus avancée avec activerecord et ne peux pas trouver la meilleure façon de l'écrire. Espérons que cela a du sens ...Requête avancée activeecord où l'association avec une limite

Mes POSTGRES/Rails app a des modèles:

Company has_many :employees 
Employee has_many :evaluations 

Evaluations a colonne décimales: score. Je veux obtenir les 10 scores d'évaluation les plus bas pour une entreprise par son nom. MAIS je veux aussi seulement tirer un score le plus bas de chaque employé. Je ne souhaite pas que 5 des 10 scores de ma liste de résultats proviennent tous du même ID d'employé.

Je:

@list = Company.where(:name => 'Google').joins(:evaluations) 

Mais je me bats avec la façon de limiter les évaluations à une faible valeur unique sur une seule employee.id

Quelle est la meilleure façon de le faire?

+0

Peut-être 'Company.where (: name => 'Google'). Joint (: évaluations) .minimum ('evaluations.value')'? pas sûr si fonctionne – fotanus

+0

Votre question demande plus d'explications, que voulez-vous dire quand vous dites «Je veux aussi seulement tirer un score le plus bas de chaque employé. Je ne veux pas que 5 des 10 scores de ma liste de résultats proviennent tous du même ID d'employé. »Voulez-vous le score le plus bas pour chaque employé de l'entreprise, ou voulez-vous le score d'évaluation des 10 employés le plus bas? pour une entreprise, de sorte que chaque note d'évaluation des employés provient d'un employé distinct? –

+0

Votre dernière phrase est ce que je veux ... Je veux tirer les 10 meilleurs scores des employés distincts. –

Répondre

3

est ici le 'off-the-top-of-my-tête' deviner:

Employee. 
    select('employees.*, min(evaluations.score) as lowest_score'). 
    joins(:company, :evaluations). 
    where(:company => {:name => 'Google'}). 
    group('employees.id'). 
    order('lowest_score'). 
    limit(10) 
+0

Une version légèrement modifiée de cela a fonctionné pour moi. Merci. –

+0

Quelle était la modification? –

0
@list = Evaluation.joins(:employee => :company) 
    .where(:company => { :name => "Google" }) 
    .order(:score) 
    .group(:employee => :id) 
    .first(10) 

IIRC, la commande par le score devrait signifier que vous n'avez pas à se soucier de fonctions min et des choses comme il va choisir le premier enregistrement en faisant le groupement, qui sera le score le plus bas. Essayer.

+0

J'utilise Postgres, et il jette une erreur sur la colonne .order "evaluations.id" doit apparaître dans la clause GROUP BY ou être utilisé dans une fonction d'agrégat –