【问题标题】:How to create dynamic attribute in rails for Active Record update method如何在 Rails 中为 Active Record 更新方法创建动态属性
【发布时间】:2016-11-17 11:35:21
【问题描述】:

我有一些从 Get/Post 请求中得到的变量 =>

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

我很想使用活动记录的update 方法来更新记录(需要运行验证)。然后我怎样才能创建一个动态查询,如

@user.update(status: value)

我试过了。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 抱歉,这只是问题中的一个类型。很奇怪,现在我可以看到它没有通过验证。基本相同的代码。也许我之前使用了错误的值
    • 可能,但无论如何很高兴您的问题得到了解决!
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果有多个字段和值用逗号分隔

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-01
          • 2015-05-17
          相关资源
          最近更新 更多