我试图在一个易于阅读的格式化代码中删除一堆列。我知道我可以这样做:
@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'数组不起作用?
答案 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)