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
要在没有回调的情况下更新多个属性,您可以在模型中使用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
对于 mongoid,我最终使用了http://mongoid.org/en/mongoid/docs/persistence.html 具体来说,你可以使用:
person.set(name:"Robert Pulson")
Run Code Online (Sandbox Code Playgroud)
并且不会发出回调。非常酷。
作为一个普遍的答案,在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指南中还有其他选项,但是我发现这种方法是最简单的。
| 归档时间: |
|
| 查看次数: |
51480 次 |
| 最近记录: |