2011-03-08 94 views

回答

18

使用ActiveRecord::Base#sum

user.attachments.sum(:visits) 

这将产生一个有效的SQL查询是这样的:

SELECT SUM(attachments.visits) FROM attachments WHERE attachments.user_id = ID 
+0

如果您想总结一个访问范围,该怎么办?例如,访问的范围是:active, - > {where('attribute IS NOT NULL')}。像“user.attachments.sum(visits.active)? – doug 2014-09-30 22:43:21

12
user.attachments.map{|a| a.visits}.sum 
+5

或'user.att achments.map(&:visits).sum' – rubyprince 2011-03-08 14:49:23

+10

或'user.attachments.sum(&:visits)' – Jordan 2011-03-08 15:36:01

+0

事实上,@ Jordon的解决方案是最好的。 – Calin 2011-03-09 11:43:35

5

还有inject

user.attachments.inject(0) { |sum, a| sum + a.visits } 

人们普遍(才怪)讨厌inject,但由于实现这一目标的其他两个主要途径已经提到,我想我可能也把它在那里。 :)

2

与普通老式Ruby对象下面的作品,我怀疑下面是稍快比使用count += a.visits,加上它有一个表情:

user.attachments.map(&:visits).inject(:+) 
+0

哈哈哈哈到目前为止,最好的回答哈哈哈 – facundofarias 2015-02-27 12:10:51