2

我有一个Department与用户有两个关联的模型,这样

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")

然后我得到大量重复的结果,并且我还排除了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
4

1 回答 1

4

所以这里有2个问题:

  1. 您正在使用可能不存在.joins的关联。belongs_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")
于 2012-12-03T21:40:23.960 回答