接受的答案实际上并不是那么好,因为它给出了 N+1 查询问题,因为获取的每一行都会导致查询获取总和。而且它不允许您按聚合排序。
您想要的是执行自定义选择:
@users = User.joins(:predictions)
.where("fixture_date <= ?", Date.today)
.select('users.*, SUM(predications.score) AS total_score')
.group('users.id')
这将返回一个包含完整用户记录的 ActiveRecord::Relation 对象。
irb(main):031:0> @users.each { |u| puts "User #{u.id} has a total score of #{u.total_score}"}
User 2 has a total score of 2
User 1 has a total score of 5
=> [#<User id: 2, email: nil, password_digest: nil, created_at: "2018-09-03 06:04:57", updated_at: "2018-09-03 06:04:57">, #<User id: 1, email: nil, password_digest: nil, created_at: "2018-09-03 06:01:45", updated_at: "2018-09-03 06:01:45">]
正如您从示例中看到的那样,ActiveRecord 实际上会神奇地为您获取的任何其他列创建访问器。
您可以使用该列通过应用进行排序.order
:
@users = User.joins(:predictions)
.where("fixture_date <= ?", Date.today)
.select('users.*, SUM(predications.score) AS total_score')
.group('users.id')
.order('total_score DESC')
总共你会得到类似的东西:
class User < ActiveRecord::Base
has_many :predictions
def self.ordered_by_score
self.joins(:predictions)
.where("fixture_date <= ?", Date.current)
.group('users.id')
.order('total_score DESC')
end
end