2013-05-03 74 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