2012-12-03 16 views
2

相關領域我有一個Department模型有兩個協會用戶,以使得Rails的排序和同型號

class Department < ActiveRecord::Base 
    has_many :members, class_name:"User", foreign_key:"department_id" 
    belongs_to :director, class_name:"User", foreign_key:"director_id 
end 

要顯示該模型的列表,通過會員我能做到這一點的數量排序

@departments = Department.select("departments.*, COUNT(users.id) AS members").joins(:members).group("departments.id") 
@departments = @departments.order("members ASC") 

如果我想在導演的相關模型中的字段(last_name)進行排序,我可以這樣做:

@departments = Department.includes(:director) 
@departments = @departments.order("users.last_name") 

但是,我無法將這兩個查詢合併爲一個允許正確排序的查詢。如果我做

Department.select("departments.*, COUNT(users.id) AS members").joins(:members, :director).group("departments.id, users.last_name") 

然後我得到的重複結果廣闊ammount的,我也排除resuls其中director_id爲零。我如何構建查詢,以便我可以通過COUNT(users.id)和本質上director.last_name訂購?

編輯:這是.to_sql的壞綜合查詢:

SELECT departments.*, COUNT(users.id) AS members FROM "departments" 
INNER JOIN "users" ON "users"."department_id" = "departments"."id" 
INNER JOIN "users" "directors_departments"  
ON "directors_departments"."id" = "departments"."director_id" 
GROUP BY departments.id, users.last_name 
ORDER BY users.last_name DESC 
+0

你可以發佈rails用於這個查詢的SQL嗎?使用'.to_sql'來獲取原始生成的SQL。表格別名是這裏可能的罪魁禍首...... – PinnyM

+0

@PinnyM完成! :) – Karew

回答

4

因此,有2個問題在這裏:

  1. 您使用.joinsbelongs_to協會,可能不存在。
  2. 您正在兩次加入相同的用戶表(對於2個不同的關聯),導致rails生成表別名,以使SQL有效。但是你不是在這個別名上分組。

解決方案:

你需要一個LEFT JOIN不幸的是不漂亮爲標準加入。你還需要修改你的.group子句:

Department. 
    select("departments.*, COUNT(users.id) AS members"). 
    joins(:members, "LEFT JOIN users directors ON departments.director_id = directors.id"). 
    group("departments.id, directors.last_name"). 
    order("members, directors.last_name") 
+0

勝利,謝謝! – Karew