web-dev-qa-db-fra.com

incrément vs + = 1

J'ai un modèle d'image qui contient une variable pour un nombre de vues (entier). Le nombre de vues est incrémenté de +1 chaque fois que quelqu'un affiche l'objet Image.

Pour ce faire, quelle est la différence entre

   @picture.view_count += 1
   @picture.save

et

   @picture.increment(:view_count, 1)

aussi si j'utilise l'incrément, est-ce que .save est nécessaire?

33
James Pleasant

La source de increment est ci-dessous, ce qui initialise l'attribut à zéro si nul et ajoute la valeur passée comme par (la valeur par défaut est 1), il ne sauvegarde pas, donc .save est toujours nécessaire.

def increment(attribute, by = 1)
  self[attribute] ||= 0
  self[attribute] += by
  self
end
46
xdazz

J'utilise souvent counter_cache et increment_counter dans ce cas.

comme ça:

Picture.increment_counter(:view_count, @picture.id)

Cette méthode est plus simple et plus rapide que la méthode autodidacte.

Par ailleurs, ActiveRecord :: CounterCache a également decrement_counter.

http://api.rubyonrails.org/classes/ActiveRecord/CounterCache/ClassMethods.html

24
nekova

Vous devez utiliser counter_cache. counter_cache vous aide à incrémenter automatiquement le nombre d'enregistrements.

class Picture < ActiveRecord::Base
  has_many :views
end

class View < ActiveRecord::Base
  belongs_to :picture, counter_cache: true
end

la table d'images a besoin d'une colonne avec le nom views_count, ou vous pouvez utiliser votre propre nom pour cette colonne, par exemple:

belongs_to :picture, counter_cache: :number_of_views

Mais je vous recommande d'utiliser le nom par défaut pour la colonne counter_cache qui est views_count.

4
Vladimir Melnik