将哈希数组转换为结构数组?

时间:2010-03-24 02:09:40

标签: ruby-on-rails ruby hash arrays struct

假设我有两个对象:User和Race。

class User
  attr_accessor :first_name
  attr_accessor :last_name
end

class Race
  attr_accessor :course
  attr_accessor :start_time
  attr_accessor :end_time
end

现在假设我创建了一个像这样的哈希数组:

user_races = races.map{ |race| {:user => race.user, :race => race} }

如何将user_races转换为结构数组,请记住我希望能够从struct元素访问user和race的属性? (关键是我想通过Struct创建一个新对象,以便我可以访问User和Race的组合属性。例如,UserRace.name,UserRace.start_time。)

4 个答案:

答案 0 :(得分:2)

试试这个:

class User
  attr_accessor :first_name
  attr_accessor :last_name
end

class Race
  attr_accessor :course
  attr_accessor :start_time
  attr_accessor :end_time
end

UserRace = Struct.new(:first_name, :last_name, :course, :start_time, :end_time)

def get_user_race_info      
  user_races = races.map do |r| 
    UserRace.new(r.user.first_name, r.user.last_name, 
              r.course, r.start_time, r.end_time)
  end
end

现在让我们测试一下结果:

user_races = get_user_race_info
user_races[0].first_name
user_races[0].end_time

答案 1 :(得分:1)

为UserRace对象创建一个定义(作为Struct),然后只创建一个所述对象的数组。

UserRace = Struct.new(:user, :race)

user_races = races.map { |race| UserRace.new(race.user, race) }

# ...

user_races.each do |user_race|
  puts user_race.user
  puts user_race.race
end

答案 2 :(得分:1)

如果您的哈希具有如此多的属性,以便将它们全部列出:

user_races = races.map{ |race| {:user => race.user, :race => race, :best_lap_time => 552.33, :total_race_time => 1586.11, :ambient_temperature => 26.3, :winning_position => 2, :number_of_competitors => 8, :price_of_tea_in_china => 0.38 } } # garbage to show a user_race hash with many attributes

变得很麻烦(或者如果您稍后可能会添加更多属性),您可以使用*(“splat”)运算符。

the splat operator converts an array into an argument list. 所以你可以通过执行以下操作来填充Struct.new的参数列表和哈希中的键列表:

UserRace = Struct.new(*races.first.keys)

当然,这假设数组中的所有哈希都具有相同的键(按相同的顺序)。

一旦定义了结构,就可以使用inject来构建最终的对象数组。 (inject greatly simplifies converting many objects from one data type to another。)

user_races.inject([]) { |result, user_race| result << UserRace.new(*user_race.values) }

答案 3 :(得分:0)

你有这个:::

user_races = races.map{ |race| {:user => race.user, :race => race} }

现在创建一个Struct,如下所示:

UserRace = Struct.new(:user, :race)

然后::

user_races.each do |user_race|
   new_array << UserRace.new(user_race[:user],user_race[:race])
end

没有测试过代码......应该没问题......说什么?

编辑:这里我将UserRace的对象添加到new_array。