Ruby循环访问对象的某些属性

时间:2012-07-12 19:18:03

标签: ruby-on-rails ruby attributes metaprogramming

在Rails中,我有一个班级名称User,我只想看看:name, :address, :age

我想写一段类似的代码:

user = User.new
[name, address, age].zip(["Name", "Address", 10]).each do |attribute, val|
  user.attribute = val
end

事情是我不知道如何正确地做到这一点,因为user.attribute显然不是一个有效的行。换句话说,无论如何,user.attribute被评估为user.nameuser.addressuser.age取决于循环吗?

谢谢

4 个答案:

答案 0 :(得分:5)

您应该使用send方法

user.send "#{attribute}=", val

如果属性是,例如:name,则上面的行等同于

user.name = val

答案 1 :(得分:1)

其实我可以这样做:

[name, address, age].zip(["Name", "Address", 10]).each do |attribute, val|
    user[attribute] = val
end

这种方式也有效

答案 2 :(得分:1)

user.send(:name)与调用user.name相同,所以您可能想尝试一下。

答案 3 :(得分:1)

user = User.new
[name, address, age].zip(["Name", "Address", 10]).each do |attribute, val|
  user.write_attribute(attribute, val)
end

但那是我写的:

user = User.new
user.attributes = {name => "Name", address => "Address", age => 10}