如何在ruby中循环中动态访问Model属性?

时间:2015-09-28 05:29:12

标签: ruby-on-rails ruby string-interpolation

我的模特课:

class item
  attr_accessor :item_name
  attr_accessor :item_url
  attr_accessor :item_label
  .
  . 
end

当我想为这些属性分配值时。逐个分配,即item.item_name="abc"

我想将所有属性放在带有硬编码名称的循环中,并为其他来源分配表单。

['item_url','item_url','item_label'].each do |attr|
   item.attr=values from some other source #error on this line
   #or
   item."#{attr}"=values from some other source #error on this line
end

他们两个都没有工作。欢迎任何建议

3 个答案:

答案 0 :(得分:3)

你可以这样做:

 item.send((attr + "="), values from some other source)

或:

hash = {}
['item_url','item_url','item_label'].each do |attr|
  hash[attr] = value
end
item.attributes = hash

答案 1 :(得分:1)

您可以使用send

item.send("#{attr}=", value)

http://ruby-doc.org/core-2.2.3/Object.html#method-i-send

答案 2 :(得分:1)

attr_accessor为每个以setter方法给出的属性定义#attr=。例如,您可以使用#item_name=为item_name分配值。要在给定方法名称的字符串或符号的情况下调用实例上的方法,请在实例上调用__send__

['item_url','item_url','item_label'].each do |attr|
  item.__send__("#{attr}=", value)
end

send也有效,但我更喜欢__send__因为send更有可能被意外覆盖。