Rails:更新模型属性而不调用回调

Sam*_*ern 69 ruby attributes model ruby-on-rails callback

我有一个具有:credits属性的User模型.我想要一个简单的按钮,通过一个名为"add"的路由将5添加到用户的信用点,这样/ users/3/add会将5添加到用户id = 3的信用点.

def add
    @user = User.find(params[:id])
    @user.credits += 5
    redirect_to root_path
end
Run Code Online (Sandbox Code Playgroud)

这是我的控制器的相关部分.问题是,我不想调用@ user.save,因为我有一个before_save回调,它根据当前的UTC时间重新加密用户的密码.我只想简单地为属性添加5并避免回调,我从未想过这么简单的事情会如此困难.

编辑:

我将回调更改为:before_create,这是我的新控制器代码(相关部分):

  def add
    @user = User.find(params[:id])
    @user.add_credits(5)
    @user.save
    flash[:success] = "Credits added!"
    redirect_to root_path
  end
Run Code Online (Sandbox Code Playgroud)

这是我在模型中的代码:

 def add_credits(num)
    self.credits = num
 end
Run Code Online (Sandbox Code Playgroud)

编辑2:

好吧,这是一个验证问题,使"编辑"中的更改无法正常工作,但我仍然喜欢在没有回调的情况下更新原始问题的答案!

cvs*_*erd 131

引入了Rails 3.1 update_column,它与之相同update_attribute,但没有触发验证或回调:

http://apidock.com/rails/ActiveRecord/Persistence/update_column


Mat*_*ith 7

要在没有回调的情况下更新多个属性,您可以在模型中使用update_all,如下所示:

self.class.update_all({name: value, name: value}, self.class.primary_key => id)
Run Code Online (Sandbox Code Playgroud)

如果你真的想要甚至可以尝试使用update_columns方法并将其混合到你的活动记录基类中.

要更新一个属性,可以使用update_column.此外,还有一些特定的方法可以在rails指南中找到http://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks


hb9*_*922 6

对于 mongoid,我最终使用了http://mongoid.org/en/mongoid/docs/persistence.html 具体来说,你可以使用:

person.set(name:"Robert Pulson")
Run Code Online (Sandbox Code Playgroud)

并且不会发出回调。非常酷。

  • @JudeCalimbas 不,不是,ArgumentError:参数数量错误(给定 2,预期为 1) (2认同)

Mat*_*att 6

作为一个普遍的答案,在Rails 4中,这是一种无需触发回调即可更新属性的简单方法:

@user.update_column 'credits', 5
Run Code Online (Sandbox Code Playgroud)

如果您需要更新多个属性而没有触发器回调:

@user.update_columns credits: 5, bankrupt: false  
Run Code Online (Sandbox Code Playgroud)

如果您愿意,Rails指南中还有其他选项,但是我发现这种方法是最简单的。

  • user.update_column积分:5不起作用。应该是user.update_column'credits',5 (4认同)