, если ваш хэш имеет так много атрибутов, что перечисляет их все:
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").
оператор splat преобразует массив в список аргументов.
так что вы можете заполнить список аргументов Struct.new списком ключей в вашем хэше, выполнив:
UserRace = Struct.new(*races.first.keys)
конечно, это предполагает, что все хэши в вашем массиве имеют одинаковые ключи (в одинаковом порядке).
Как только вы определили свою структуру, вы можете использовать inject
для построения окончательного массива объектов. ( Внедрение значительно упрощает преобразование многих объектов из одного типа данных в другой .)
user_races.inject([]) { |result, user_race| result << UserRace.new(*user_race.values) }