【问题标题】:ActiveRecord Query. Group by multiple columns from multiple tables活动记录查询。按多个表中的多个列分组
【发布时间】:2017-04-19 23:59:07
【问题描述】:
Attendance.joins(:user).group(:email, :name).count

上面的查询给了我以下结果。 “用户 1”有 2 次出席,“用户 2”有 6 次出席,而且我可以访问用户名和电子邮件。

{["email@example.com", "User 1"]=>2, ["email2@example.com", "User 2"]=>6]}

这很好,除了我真的希望 User.id 也包含在内。我不能按 ID 分组,因为这样每条记录都是唯一的,而不是按电子邮件和姓名分组。以下是我想要的:

{[1, "email@example.com", "User 1"]=>2, [2, "email2@example.com", "User 2"]=>6]}

任何帮助将不胜感激。

回答 Attendance.joins(:user).group(:email, :name, 'attendances.user_id').count

【问题讨论】:

  • 它不应该是唯一的,除非你按Attendence.id分组?
  • 按 ID 分组将是出勤的 ID。按 user_id 分组,我假设它在那个表上,会给你你想要的。
  • 你将如何构造这个查询?我不断收到错误....“Attendance.joins(:user).group(:email, :name, 'attendance.user_id').count” 我得到的错误是“ActiveRecord::StatementInvalid: PG::UndefinedTable : 错误: 缺少表“出席”的 FROM 子句条目
  • 表名将是复数 - 试试attendances
  • 你们完全正确!我发誓我试过一千次;)

标签: sql ruby-on-rails postgresql activerecord


【解决方案1】:
Attendance.joins(:user).group(:email, :name, 'attendances.user_id').count

【讨论】:

    【解决方案2】:
    # collect required fields and group by email, name
    grouped_attendance = Attendance.joins(:user).pluck(:id, :email, :name).group_by{|r| [r[1], r[2]]}
    
    # calculate the counts
    attendance_counts = grouped_attendance.each{|k,v| grouped_attendance[k] = v.count}
    

    取决于您的设置,但以上应该足够快,因为您没有实例化 ActiveRecord 对象。

    【讨论】:

    • 感谢您的回复!当我尝试第一个查询时出现以下错误: undefined method `email' for [1, "email@examplecom", "User 1"]:Array
    • 更正了语法 - r 是一个数组(不是对象) - 必须使用数组索引进行分组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多