获取Rails模型中关联列的总和
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取Rails模型中关联列的总和相关的知识,希望对你有一定的参考价值。
我的模型设置如此
class User < ActiveRecord::Base
attr_accessible :name
has_many :predictions
end
class Prediciton < ActiveRecord::Base
attr_accessible :user_id, :score
belongs_to :user
end
我想要做的是获取每个用户的得分列中所有值的总和。
到目前为止,我在我看来已经提出了这个问题:
<% @user.each do |u| %>
<% u.predictions.each do |h| %>
<%= u.name %><%= h.score %>
<% end %>
<% end %>
但我的控制器只是
@user = User.all
我觉得这样的事可能有用吗?
@user = User.all
@scores = @user.predictions.where("fixture_date <= ?", Date.today).sum(:score)
但事实并非如此。我是以错误的方式接近这个吗?
答案
向用户添加总和得分:
class User < ActiveRecord::Base
attr_accessible :name
has_many :predictions
def sum_score
predictions.where("fixture_date <= ?", Date.today).sum(:score)
end
end
在视图中:
<% @user.each do |u| %>
<%= u.name %><%= u.sum_score %>
<% end %>
另一答案
接受的答案实际上并不是那么好,因为它提出了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
以上是关于获取Rails模型中关联列的总和的主要内容,如果未能解决你的问题,请参考以下文章