在rails模型中使用带有列名的变量名

时间:2015-08-27 14:17:52

标签: ruby-on-rails ruby-on-rails-4

我的产品型号中有一段代码,我通过从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个单独的列。

任何指针都将受到赞赏。

提前致谢!

2 个答案:

答案 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