如何汇总嵌套集合的所有属性?

Mar*_*tin 10 ruby ruby-on-rails ruby-on-rails-3

鉴于我将User.attachments和Attachment.visits作为带有数字计数的整数.

如何轻松计算该用户所有图像的所有访问次数?

tok*_*and 19

使用ActiveRecord :: Base#sum:

user.attachments.sum(:visits)
Run Code Online (Sandbox Code Playgroud)

这应该生成一个有效的SQL查询,如下所示:

SELECT SUM(attachments.visits) FROM attachments WHERE attachments.user_id = ID
Run Code Online (Sandbox Code Playgroud)


Cal*_*lin 15

user.attachments.map{|a| a.visits}.sum
Run Code Online (Sandbox Code Playgroud)

  • 或`user.attachments.sum(&:visits)` (10认同)
  • 或`user.attachments.map(&:visits).sum` (6认同)
  • 当:visits是附件表中的一列时,是的,user.attachments.sum(:visits)最好。但是,如果严格地讲,这是对对象的一种方法,则需要Calin,rubyprince或Jordan的解决方案(可枚举的总和)的某些变体。 (2认同)

idl*_*ers 5

还有inject:

user.attachments.inject(0) { |sum, a| sum + a.visits }
Run Code Online (Sandbox Code Playgroud)

人们通常(并且非常正确地)讨厌inject,但是由于提到了实现这一目标的另外两种主要方式,我想我也可以把它扔出去.:)