2011-02-16 52 views
5

Estoy intentando incrementar un contador en mi tabla de usuario desde otro modelo.Contador de incrementos de Ruby on Rails en el modelo

class Count < ActiveRecord::Base 
    belongs_to :user 

    after_create :update_count 

    def update_count 
     user = User.find(self.user_id) 
     user.increment(:count) 
    end 

end 

Así que cuando se crea el recuento, el objetivo sería incrementar una columna del contador para ese usuario. Actualmente se niega a obtener el usuario después de la creación y me da un error nulo.

estoy usando diseñar para mis usuarios

Es esta la derecha (mejores prácticas) lugar de hacerlo? Lo tenía trabajando en los controladores, pero quería limpiarlo.

No tengo mucha experiencia con las devoluciones de llamada de modelos.

+0

¿Puede agregar el código que está utilizando para crear el objeto Count? Puede incluir su objetivo o caso de negocio, de lo contrario, prepárese para un montón de respuestas que intentan refactorizar lo que está haciendo. – gmoore

+0

Entiendo, quería generalizar el Modelo y simplificar la situación. El usuario tiene_muchas cuentas donde cada entrada de usuario tiene una columna que realiza un seguimiento de los recuentos al momento de su creación (cuenta de usuario). – febs

Respuesta

11

Si tiene muchas UserCounts y Count pertenece a User (como parece ser), entonces es posible que desee utilizar un counter cache. Hace exactamente lo que quiere hacer, y está integrado en ActiveRecord.

+0

Ah, veo que no estaba al tanto de esa funcionalidad. Voy a dar una oportunidad! – febs

+2

Funcionó perfectamente. Rails haciendo que sea muy fácil :) – febs

0

Creo que un mejor lugar para esto sería usar un observer que escucha el on_create para objetos de usuario, y luego ejecuta esta lógica.

Algo así como:

class UserObserver < ActiveRecord::Observer 
    def after_create(user) 
    Counter.find_by_name("user_count").increment 
    end 
end 
+0

Solución interesante, voy a experimentar con el contador de caché y los observadores. – febs

0

Si desea un contador de cachés más extensible, consulte counter_culture. Admite la funcionalidad básica del contador de caché, pero también le permite crear contadores de registros que cumplan varias condiciones. Por ejemplo, puede crear fácilmente un recuento de usuario inactivo con un código como este:

class Product < ActiveRecord::Base 
    belongs_to :category 
    counter_culture :category, :column_name => \ 
    Proc.new {|model| model.inactive? ? 'inactive_count' : nil } 
end