【问题标题】:Rails sort by association count and associated field on same modelRails 按关联计数和同一模型上的关联字段排序
【发布时间】:2012-12-04 05:46:22
【问题描述】:

我有一个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 为 nil 的结果。如何构建查询以便我可以同时按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

【问题讨论】:

  • 您能发布 Rails 用于此查询的 SQL 吗?使用 .to_sql 获取原始生成的 SQL。表别名可能是这里的罪魁祸首...

标签: ruby-on-rails activerecord


【解决方案1】:

所以这里有两个问题:

  1. 您正在对可能不存在的 belongs_to 关联使用 .joins
  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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多