Rails基于数组更新多个列

时间:2015-04-25 16:08:13

标签: ruby-on-rails ruby arrays activerecord

我试图在一个易于阅读的格式化代码中删除一堆列。我知道我可以这样做:

@user = User.find(3)
@user.column1 = nil
@user.column2 = nil
@user.column3 = nil
etc...

但这似乎不是一种非常 Ruby 做事的方式,也不是特别干净的阅读。

我试图找出为什么我不能像这样做'each do'数组:

columns = [ "key", "provider", "uid", "access_code",
                "customer_id", "cc_id", "cc_brand", "cc_last4",
                "cc_expiration", "last_payment_id", "last_payment_date",
                "last_payment_amount" ]

columns.each do |record|
  @user.record = nil
end

@user.save

我收到以下错误:

undefined method `record=' for #<User:0x00000003a91d18>

我知道之前已经提出了类似的问题,但它们通常与更新了一堆不同的表有关。我只对用户表感兴趣。

此外,还有很多答案链接到http://apidock.com/rails/ActiveRecord/Base/update_all/class。但这是一种旧的弃用方法,显然绕过了回调。这似乎很危险。

有谁能想到为什么一个简单的'each do'数组不起作用?

3 个答案:

答案 0 :(得分:1)

您可以对动态函数名称使用send funtion:

 @user.send("#{record}=", nil)

答案 1 :(得分:1)

send也可用于调用与模型相关的方法(私有方法)。

但是,因为在您的情况下,您只是编辑ActiveRecord对象的字段(而不是调用任何方法),所以这是另一种方法:

columns = [ "key", "provider", "uid", "access_code",
            "customer_id", "cc_id", "cc_brand", "cc_last4",
            "cc_expiration", "last_payment_id", "last_payment_date",
            "last_payment_amount" ]

columns.each do |record|
  @user[record] = nil
end

@user.save

答案 2 :(得分:1)

另一种选择,不使用send

的瑞士军刀
columns = [ "key", "provider", "uid", "access_code",
            "customer_id", "cc_id", "cc_brand", "cc_last4",
            "cc_expiration", "last_payment_id", "last_payment_date",
            "last_payment_amount" ]

params = columns.map(&:to_sym).zip([nil]).to_h

@user.update_attributes(params)