Подтвердить что ты не робот

.increment vs + = 1

У меня есть модель Picture, содержащая переменную для числа просмотров (целое число). Количество просмотров увеличивается на +1 каждый раз, когда кто-то просматривает объект Picture.

Чтобы сделать это, какая разница между

   @picture.view_count += 1
   @picture.save

и

   @picture.increment(:view_count, by = 1)

также, если я использую приращение, является необходимым?

4b9b3361

Ответ 1

Ниже приведен источник increment, который инициализирует атрибут нулем, если nil и добавляет значение, переданное как (по умолчанию равно 1), оно не сохраняет, поэтому .save по-прежнему необходимо.

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

Ответ 2

Я часто использую counter_cache и increment_counter в этом случае.

вот так:

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

Этот способ проще и быстрее, чем самодельный метод.

Кстати, ActiveRecord:: CounterCache также имеет decrement_counter.

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

Ответ 3

Вы должны использовать counter_cache. counter_cache позволяет автоматически увеличивать число записей.

class Picture < ActiveRecord::Base
  has_many :views
end

class View < ActiveRecord::Base
  belongs_to :picture, counter_cache: true
end
Для таблицы рисунков

требуется столбец с именем views_count, или вы можете использовать свое собственное имя для этого столбца, например:

belongs_to :picture, counter_cache: :number_of_views

Но я рекомендую вам использовать имя по умолчанию для столбца counter_cache, который является view_count.