.increment vs + = 1

时间:2012-07-16 06:30:28

标签: ruby-on-rails ruby increment

我有一个Picture模型,其中包含视图计数(整数)的变量。 每当有人查看Picture对象时,视图计数就会增加+1。

完成这项工作后,

之间有什么区别
   @picture.view_count += 1
   @picture.save

   @picture.increment(:view_count, 1)

如果我使用增量,是否需要.save?

3 个答案:

答案 0 :(得分:45)

increment的来源如下,如果nil将属性初始化为零并添加传递的值(默认为1),则不执行保存,因此仍需要.save

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

答案 1 :(得分:24)

在这种情况下,我经常使用counter_cacheincrement_counter

像这样:

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

这种方式比自制方法更简单,更快捷。

顺便说一句,ActiveRecord :: CounterCache也有decrement_counter

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

答案 2 :(得分:4)

你应该使用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列的默认名称,即views_count。