2010-12-05 8 views
8

Tengo dos modelos de Rails, dicen un Niño y un Padre.Modelos asociados y consulta SUM en Rails

sé que puedo hacer esto:

Child.sum(:income, :conditions => "parent_id = #{@parent_id}") 

Pero yo quiero ser capaz de hacer esto:

Parent.children.sum(:income) 

Pero esto es darme los valores equivocados si lo intento. ¿Hay una forma más concisa de escribir

Child.sum(:income, :conditions => "parent_id = #{@parent_id}") 

?

TIA

[PS: Carriles entorno dev 3]

Respuesta

13

Lo sentimos, pero sólo he encontrado la respuesta a esto. Yo tenía que añadir to_a a la colección de objetos secundarios, y llamar a un proc, así como:

Parent.children.to_a.sum(&:income) 

Esto funciona a las mil maravillas.

3

Lo siento por dar con un hilo viejo, pero creo que encontré una mejor (¿la mejor?) Solución. A continuación se muestra el código para mi proyecto que terminé

self.purchases.where(:script_id => script_id, :approved => true).sum(:instances) 

Se produce una consulta que hace exactamente lo que necesito

SELECT SUM("purchases"."instances") AS sum_id FROM "purchases" WHERE "purchases"."customer_id" = 1 AND "purchases"."script_id" = 1 AND "purchases"."approved" = 't' 
+0

Tengo que decir que me gusta la idea de que esto tenga lugar en el modelo un poco mejor –

3

me encontré con un problema por el que el niño estaba delegando a los padres y que necesitaba para encontrar una suma

children.to_a.sum(:parent_income) 

me estaba dando un gran problema N + 1. La solución fue usar:

children.joins(:parent).sum(:income) 
0

También me encontré con una situación similar, aquí estaba la solución en los carriles 4 con también comprobar si los artículos que son contados eran activos o inactivos. Ejecuté esto en el modelo antes de guardar.

order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.price) : 0 }.sum 
Cuestiones relacionadas