2015-08-27 56 views
0

我在我的产品模型中有一段代码,我通过从s3中提取值来为列指定值。列名包括计数器“我”,以及 -在rails模型中使用具有列名称的变量名称

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

会建议挑选或者串联或串模板,而不是将两者混合的。例如。 ''pic#{i} _file_name“'或'”pic“+ i.to_s +”_file_name“' – fylooi

回答

2

你几乎得到了右边的最后一个。你看,做

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]) 
0

可以使用send方法从字符串中调用一个方法:

prod.send("pic#{i}_file_name") # to read 

prod.send("pic#{i}_file_name=", obj.key[45..-1]) # to assign 
+0

感谢您的回复。我刚刚尝试过,但是在打开网页时,这给我语法错误。错误发生在'product.rb:148:syntax error,unexpected'=',expectcting keyword_end prod.send(“pic#{i} _file_name”)= obj.key [45 ..- 1] ^' – pari

+0

对不起,那是读取值,我编辑帖子以显示分配。 – dinomix