我的产品型号中有一段代码,我通过从s3获取来为列分配值。列名包括一个计数器" i"同样 -
3个样本列名称为 -
pic1_file_name
pic2_file_name
pic3_file_name
有问题的代码是 -
prod = Product.find(id)
i=1
s3 = AWS::S3.new
bucket=s3.buckets['bucket_name']
bucket.objects.each do |obj|
prod.("pic"+"#{i}".to_s+"_file_name")=obj.key[45..1]
# the above line give a syntax error, unexpected '=', expecting end-of-input
prod.("pic"+"#{i}".to_s+"_file_name").to_sym = obj.key[45..-1]
# The above line gives an error undefined method `call' for #<Product:0x7773f18>
prod.send("pic"+"#{i}".to_s+"_file_name")=obj.key[45..-1]
# The above gives syntax error, unexpected '=', expecting end-of-input
i+=1
end
prod.save
您能否告诉我应该如何使用变量构建列名,以便我可以为其分配值,而无需每次都输入15个单独的列。
任何指针都将受到赞赏。
提前致谢!
答案 0 :(得分:3)
你几乎得到了最后一个。你看,在做什么时
obj.pic1_file_name = 'foo'
您实际上是在调用方法pic1_file_name=
,而不是pic1_file_name
。这一行等同于:
obj.pic1_file_name=('foo')
考虑到这一点,你的最后一行变为
prod.send("pic#{i}_file_name=", obj.key[45..-1])
答案 1 :(得分:2)
您可以使用send方法从字符串调用方法:
prod.send("pic#{i}_file_name") # to read
prod.send("pic#{i}_file_name=", obj.key[45..-1]) # to assign