2011-03-08 9 views

Respuesta

18

Uso ActiveRecord::Base#sum:

user.attachments.sum(:visits) 

Esto debería generar una consulta SQL eficiente como esto:

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

¿Qué pasa si desea sumar un alcance de visitas. Por ejemplo, visitas tiene ámbito: activo, -> {donde ('atributo IS NOT NULL')}. Algo así como "user.attachments.sum (visits.active)? – doug

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

o 'user.att achments.map (&: visits) .sum' – rubyprince

+10

o 'user.attachments.sum (&: visits)' – Jordan

+0

De hecho, la solución de @ Jordon es la mejor. – Calin

5

También hay inject:

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

La gente en general (y con razón) odian inject, pero ya se han mencionado las otras dos formas principales de lograr esto, pensé que puedo también tirarlo allí afuera. :)

2

Los siguientes trabajos con Plain Old Rubí objetos, y sospecho que lo que sigue es marginalmente más rápido que el uso de count += a.visits, además de que tiene un icono gestual en ella:

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

Hahahahah de lejos, la mejor respuesta jajaja – facundofarias

Cuestiones relacionadas