.increment vs + = 1
У меня есть модель Picture, содержащая переменную для числа просмотров (целое число).
Количество просмотров увеличивается на +1 каждый раз, когда кто-то просматривает объект Picture.
Чтобы сделать это, какая разница между
@picture.view_count += 1
@picture.save
и
@picture.increment(:view_count, by = 1)
также, если я использую приращение, является необходимым?
Ответы
Ответ 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.