如何在rails中为Active Record更新方法创建动态属性

时间:2016-11-17 11:35:21

标签: ruby-on-rails activerecord ruby-on-rails-5

我从Get/Post requests =>获得了一些变量。

params[:status], params[:value] #:value has the value of the :status

我希望使用活动记录的update方法来更新记录(需要运行验证)。然后,我如何创建像

这样的动态查询
@user.update(status: value)

我试过这个。

attribute = { params[:status] => params[:value] }
user.update(attribute)

但这不会调用任何验证。验证对我来说非常重要。

4 个答案:

答案 0 :(得分:2)

更新将调用验证,但您需要更改构建属性的方式,因为params[:status]:不是有效的构造。使用....

attribute = { params[:status] => params[:value] } 

答案 1 :(得分:2)

您可以使用send方法在对象上动态调用方法(属性)

http://ruby-doc.org/core-2.3.2/Object.html#method-i-send

status = params[:status]
user.send("#{status}=", params[:value])
user.save

答案 2 :(得分:1)

有两种方法可以做到这一点

attribute = { status: value }
user.update(attribute) // this should run validation for sure.

user.assign_attributes(attribute)
user.save(validate: true)

答案 3 :(得分:0)

如果用逗号分隔多个字段

attributes = {"firstname"=>"John", "surname"=>"Stack"}

在你的情况下

attributes = {params[:status] => params[:value], params[:name] => params[:value]}

如果需要,可以转换为字符串

attributes = {params[:status].to_s => params[:value].to_s, params[:status].to_s => params[:value].to_s} //default is string