2013-05-03 76 views
2

我正在尝试使用activerecord进行更高级的查询,但无法找出写入它的最佳方式。希望这是有道理的......高级积极记录查询与限制关联

我POSTGRES/Rails应用程序有型号:

Company has_many :employees 
Employee has_many :evaluations 

评估有小数列:得分。我想按名称获得公司10个最低评价分数。但我也只想从每位员工那里获得单一最低分。我不希望我的结果列表中的10个分数中的5个都来自相同的员工ID。

我:

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

然而当我如何限制在单一employee.id

什么是做到这一点的最好办法评估结果,以单一低值挣扎?

+0

也许'Company.where(:name =>'Google')。joins(:evaluateations).minimum('evaluateations.value')'?不知道是否有效 – fotanus 2013-05-03 17:58:47

+0

你的问题需要进一步解释,当你说'我也只想从每位员工中获得最低分时,你是什么意思。我不希望我的结果列表中的10个分数中的5个都来自相同的员工ID。“您希望公司中每个员工的单个最低分数,还是您希望10个最低员工评估分数对于一家公司来说,每个员工的评估分数都来自不同的员工? – 2013-05-03 18:20:10

+0

你最后一句话是我想要的......我想拉低10个最低的不同员工分数。 – 2013-05-06 12:22:30

回答

3

这里的“现成的,顶级我的头”的猜测:

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

一个略微修改后的版本为我工作。谢谢。 – 2013-05-06 16:48:20

+0

修改是什么? – 2013-05-09 16:47:49

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

IIRC,顺序按分数应该意味着你不必用最小的功能和东西打扰因为它会在分组时选择第一条记录,这将是最低的分数。给它一个旋转。

+0

我正在使用Postgres,并且它在.order列上引发错误“evaluateations.id”必须出现在GROUP BY子句中或用于聚合函数 – 2013-05-06 13:23:47