【问题标题】:How to group and sum by foreign key?如何按外键分组和求和?
【发布时间】:2019-12-21 06:38:48
【问题描述】:

我的 Rails 应用中有这两个模型:

class Person < ApplicationRecord

  has_many :payments

end

class Payment < ApplicationRecord

  belongs_to :person

end

如何将payments 分组person 并按amount 排序?

现在我有...

Payment.group(:person_id).sum("amount")

...有效,但不包括人名。它返回如下内容:

{ 1 => 1200.00, 2 => 2500.00 }

如何将IDs / 整数替换为人名,并按amount 对整个内容进行排序?

感谢您的帮助!

【问题讨论】:

  • 这些 ID 是记录 ID。您需要将它们取回或使用更具体的pluck()
  • 您真正想要的数据级别只是名称 => 值可以接受还是您正在寻找正式对象
  • @engineersmnky:抱歉回复晚了。我实际上需要{name =&gt; value, name =&gt; value} 格式的哈希来创建由 Chart.js 提供支持的图表。感谢您到目前为止的回答,我仍在尝试找出哪个是最好的。
  • 这会很棘手,除非你能保证这个人的名字永远是唯一的。
  • Hash 的键必须是唯一的,因此根据 Hash 的构造方式,可能会发生以下两种情况之一 1) 第二个键将覆盖第一个键 2) 它们将在一个键下相加你会丢失一个人的记录,同时复合另一个人的付款

标签: ruby ruby-on-rails-3 activerecord


【解决方案1】:

再具体一点:

Payment.select('people.name, SUM(payments.amount)').joins(:person).group(:person_id)

假设 persons 表在您的应用程序中被命名为 people

【讨论】:

  • 在这种情况下,走另一条路似乎更容易,例如Person.joins(:payments).select('people.*, SUM(payments.amount) as total_payments').group(:id) 然后这些正式的Person 对象具有total_payments 的虚拟属性,因为我讨厌原始SQL,所以我会使用select(Person.arel_attribute(Arel.star), Payment.arel_attribute(:amount).sum.as('total_payments'))
【解决方案2】:

这将返回您可以使用的 ActiveRecord::Relation:

Person.joins(:payments).group('persons.id').select("persons.id, persons.name, sum(payments.amount) as amounts_summ")

用于唯一的 name 字段: 假设您有 Person 模型的 name 属性,解决方案可能是这样的:

Payment.joins(:person).group(:name).order('sum_amount DESC').sum(:amount)

它生成查询

SELECT SUM("payments"."amount") AS sum_amount, "name" AS name FROM "payments" INNER JOIN "persons" ON "persons"."id" = "payments"."persons_id" GROUP BY "name" ORDER BY sum_amount DESC

并像这样返回哈希:

=> {"Mike"=>22333.0, "John"=>5676.0, "Alex"=>2000.0, "Carol"=>2000.0}

【讨论】:

  • 并假设一个人的名字对于所有记录都是唯一的
  • 哦,是的)需要做一些改变,你是对的)
  • @engineersmnky,看起来你是对的,从Person模型中获取结果更容易,添加了返回关系的查询,初始代码可能可以帮助某人分组电子邮件或其他唯一字段)
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多