0

我有以下哈希:

row = {:id => 1, :name => "Altus Raizen", :email => "altus@blarg.com"}

现在我有一个Person与以下键具有相同属性的结构row

Person = Struct.new(:id, :name, :email)

我想Person使用散列中的值动态填充对象row,如下所示:

person = Person.new
person.id = row[:id]
person.name = row[:name]
person.email = row[:email]

上面的代码可以工作,但必须有一种更优雅的方式来实现,即动态填充属性。我该怎么做呢?(实际上我有 9 个属性,因此通过考虑为其他属性(例如电话、地址等)设置值,上面的代码变得更长更“丑陋”)。

4

2 回答 2

7
person = Person.new
row.each_pair { |key, value| person.send("#{key}=", value) }
于 2013-05-30T14:38:15.913 回答
2

在红宝石中> = 1.9。你可以做:

row = {:id => 1, :name => "Altus Raizen", :email => "altus@blarg.com"}
Person = Struct.new(:id, :name, :email)

p person = Person.new(*row.values)
# => <struct Person id=1, name="Altus Raizen", email="altus@blarg.com">

这恰好起作用,因为一切都按正确的顺序排列。更多控制权赋予values_at,这也适用于较旧的红宝石:

row = {:id => 1, :name => "Altus Raizen", :email => "altus@blarg.com"}
Person = Struct.new(:id, :name, :email)
p person = Person.new(*row.values_at(:id, :name, :email))

另一种选择是 OpenStruct:

require 'ostruct'
row = {:id => 1, :name => "Altus Raizen", :email => "altus@blarg.com"}
person = OpenStruct.new(row)
p person  #=><OpenStruct id=1, name="Altus Raizen", email="altus@blarg.com">
puts person.name #=> Altus Raizen
于 2013-05-30T15:01:55.623 回答