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

时间:2012-08-10 16:44:51

标签: ruby-on-rails-3 controller save increment

我在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

它正在运行,但不是更新当前的建议,而是更新所有建议。所以我把它改成了:

 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

然后我得到:

undefined method `update_all' for #<Suggestion:0x007f87c2b918a0>

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

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

我也试过以下但没有运气:

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

2 个答案:

答案 0 :(得分:6)

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

def like
    self.increment!(:votes)
end 

现在你可以这样做:

@suggestion = Suggestion.find(params[:id])
@suggestion.like

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

答案 1 :(得分:5)

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

@suggestion.update_attribute(:votes, '1')

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

@suggestion.update_attribute(:votes, @suggestion.votes + 1)

Ethan建议使用方便的方法increment!,它的工作原理相同。

现在,如果你想在每次保存对象时实际自动增加(就像对象的其他内容被更改一样),你需要:before_save callback使用{{ 1}} without the bang