5 votes

Ruby on Rails Compteur d'incréments dans un modèle

J'essaie d'incrémenter un compteur dans ma table Utilisateur à partir d'un autre modèle.

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

Ainsi, lorsque le compteur est créé, l'objectif est d'incrémenter une colonne de compteur pour cet utilisateur. Actuellement, il refuse de récupérer l'utilisateur après la création et j'obtiens une erreur nil.

J'utilise devise pour mes utilisateurs

Est-ce le bon endroit (meilleure pratique) pour le faire ? Je l'ai fait fonctionner dans les contrôleurs, mais je voulais le nettoyer.

Je n'ai pas beaucoup d'expérience avec les rappels de modèles.

11voto

Simone Carletti Points 77653

Si User a de nombreux Counts et Count appartient à User (comme cela semble être le cas), vous pourriez alors utiliser un cache des compteurs . Il fait exactement ce que vous voulez faire, et il est intégré dans ActiveRecord.

0voto

Mitch Dempsey Points 13568

Je pense qu'il serait plus judicieux d'utiliser un observateur qui attend la commande on_create pour les objets User, puis exécute cette logique.

Quelque chose comme :

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

0voto

bayfieldcoder Points 88

Si vous souhaitez d'autres caches de comptoir extensibles, consultez les sites suivants contre-culture . Il prend en charge la fonctionnalité de base du cache de compteur, mais vous permet également de créer des compteurs d'enregistrements répondant à diverses conditions. Par exemple, vous pouvez facilement créer un compteur d'utilisateurs inactifs avec un code comme celui-ci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X