.increment vs + = 1

Jam*_*ant 33 ruby ruby-on-rails increment

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

完成这项工作后,有什么区别

   @picture.view_count += 1
   @picture.save
Run Code Online (Sandbox Code Playgroud)

   @picture.increment(:view_count, 1)
Run Code Online (Sandbox Code Playgroud)

如果我使用增量,还是.save必要吗?

xda*_*azz 47

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

def increment(attribute, by = 1)
  self[attribute] ||= 0
  self[attribute] += by
  self
end
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以使用`increment!`方法,如果你不想手动保存它 (28认同)
  • 这有点过时了,新方法是increment_counter (2认同)

小智 25

我经常使用counter_cache,并increment_counter在这种情况下.

像这样:

Picture.increment_counter(:view_count, @picture.id)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这是最好的答案,因为它负责并发. (3认同)

ego*_*lic 5

您应该使用 counter_cache。counter_cache 可以帮助您自动增加记录数。

class Picture < ActiveRecord::Base
  has_many :views
end

class View < ActiveRecord::Base
  belongs_to :picture, counter_cache: true
end
Run Code Online (Sandbox Code Playgroud)

图片表需要名为views_count的列,或者您可以为此列使用您自己的名称,例如:

belongs_to :picture, counter_cache: :number_of_views
Run Code Online (Sandbox Code Playgroud)

但我建议您使用 counter_cache 列的默认名称:views_count。