2011-08-08 7 views
9

Tengo tablas 'pedidos' y 'artículos' con la asociación has_many en el modelo.Rastrear la suma de algunos campos en la asociación - "sum_cache"

class Order < ActiveRecord::Base 
has_many :items 

class Item < ActiveRecord::Base 
belongs_to :order 

artículo consta de campo 'cantidad', y Orden consta de campo 'quantity_sum' para realizar un seguimiento de la cantidad suma elementos asociados.

Por ejemplo:

Order 1 : name='Toms shopping cart', quantity_sum=12 
Item 1 : name='T-shirt', quantity=10 
Itme 2 : name='Shoes', quantity=2 

He estado buscando una manera de modo que cada vez que se añade el nuevo artículo/editar/borrar, el campo 'quantity_sum' de la Orden se actualiza automáticamente. Actualmente he estado usando el método after_save en Item, para actualizar el campo 'quantity_sum' de Order.

¿Hay alguna otra manera ordenada de hacer esto además de 'after_save' ???

Similar a "counter_cache" para rastrear el recuento de asociaciones, ¿los raíles tienen soporte para realizar un seguimiento automático de la suma de algunos campos en la asociación?

Gracias

+1

el método de devolución de llamada es correcta: http://stackoverflow.com/a/5334639/8843 – tal

Respuesta

3

Eliminar el campo quantity_sum desde su mesa y añadir un método quantity_sum a la clase para que resume los quantity_values ​​

class Order < ActiveRecord::Base 
    has_many :items 

    def quantity_sum 
    self.items.sum(:quantity) 
    end 
end 

debe hacer el truco. Todo lo que necesita hacer es eliminar cualquier código que pueda tener que actualice el campo quantity_sum. Descubrirá que debido a que el nombre del método es el mismo que el nombre del campo (que no debe olvidar borrar), no tendrá que refactorizar ninguno de los códigos que lo utilizan.

Obviamente debe tener cuidado de no utilizar este campo innecesariamente como en una lista de todos los pedidos en el sistema ya que esto será bastante pesado en la base de datos. O.K por unos cientos de registros, pero notará un problema de rendimiento en miles de pedidos.

No se olvide de quitar ese campo quantity_sum de la tabla de orden

+2

Es cierto, pero el método quantity_sum incendios hasta nuevas consultas siempre que sea se llama. Si hay un gran número de artículos en un mismo pedido, se dispara una gran cantidad de consultas, lo que aumenta el tiempo de respuesta del servidor. Para evitar esto, consideré almacenar la suma en la base de datos. – jayandra

0

Creo que es lo this gem Your'e buscando.
Busque en "Totalizar en lugar de contar" en los documentos.
Se le debe permitir a algo como esto:

class Item < ActiveRecord::Base 
    belongs_to :order 
    counter_culture :order, :column_name => 'quantity_sum', :delta_column => 'quantity' 
end 

class Order < ActiveRecord::Base 
    has_many :items 
end 
Cuestiones relacionadas