在Rails 3中保存时增加整数?

dan*_*mcc 0 controller increment save ruby-on-rails-3

我在Rails 3应用程序中有以下代码:

 def like
    @suggestion = Suggestion.find(params[:id])
    Suggestion.update_all("votes = (votes + 1)")
    redirect_to suggestions_url
  end

  def dislike
    @suggestion = Suggestion.find(params[:id])
    Suggestion.update_all("votes = (votes - 1)")
    redirect_to suggestions_url
  end
Run Code Online (Sandbox Code Playgroud)

它正在工作,但不是更新当前的建议,而是更新所有建议.所以我改成了:

 def like
    @suggestion = Suggestion.find(params[:id])
    @suggestion.update_all("votes = (votes + 1)")
    redirect_to suggestions_url
  end

  def dislike
    @suggestion = Suggestion.find(params[:id])
    @suggestion.update_all("votes = (votes - 1)")
    redirect_to suggestions_url
  end
Run Code Online (Sandbox Code Playgroud)

但后来我得到:

undefined method `update_all' for #<Suggestion:0x007f87c2b918a0>
Run Code Online (Sandbox Code Playgroud)

所以然后我尝试了@suggestion.update_attribute(:votes, '1')但是将值重置为1而不是递增它.

实现这一目标的正确方法是什么?我只想让当前建议的整数(投票)在每次保存时增加/减少1.

我也试过以下没有运气:

def like
 @suggestion = Suggestion.find(params[:id])
 @suggestion.increment(:votes)
 redirect_to suggestions_url
end
Run Code Online (Sandbox Code Playgroud)

Eth*_*yon 6

这似乎更适合模型.我建议like在模型中创建一个方法,如下所示:

def like
    self.increment!(:votes)
end 
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

@suggestion = Suggestion.find(params[:id])
@suggestion.like
Run Code Online (Sandbox Code Playgroud)

注意:increment!,感叹号也执行保存操作


dca*_*man 5

几件事.听起来你想要的是一个控制器动作,它将属性增加一个.你可能最接近代码

@suggestion.update_attribute(:votes, '1')
Run Code Online (Sandbox Code Playgroud)

如果检查该方法的文档,则会将该属性的值设置为votes第二个参数,'1'对象上的字符串@suggestion,以及数据库中的相应行.'1'您希望将其设置为递增值,而不是将其设置为:

@suggestion.update_attribute(:votes, @suggestion.votes + 1)
Run Code Online (Sandbox Code Playgroud)

Ethan建议使用方便的方法,增加!,工作原理相同.

现在,如果你每一个对象被保存的时间(如在其他关于对象的东西要真正自动递增被改变,你要使用的:before_save 回调increment 没有爆炸.