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?
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
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
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.