2016-09-09 2 views
0

У меня есть массив, который создается динамически и выглядит следующим образом:рубин преобразования массива хэш объект JSON

ids = [111,333,888] 

Я пытаюсь создать объект JSON, который выглядит, как это в конечном счете:

{ 
    "cars": [{ 
     "id": "111" 
    }, { 
     "id": "333" 

    }, { 
     "id": "888" 
    }] 
} 

Так что я попытался это время тестирования в РЕПЛ:

cars_object.merge!(cars: [id: ids]).to_json 

, который не работает. Я не знаю, как это сделать. мне нужно перебирать массив?

ответ

1

Предлагаю вам использовать метод Array#product.

{ "cars": ["id"].product(ids).map { |k,v| { k=>v } } } 
    #=> {:cars=>[{"id"=>111}, {"id"=>333}, {"id"=>888}]} 

или

{ "cars": ["id"].product(ids).map { |a| [a].to_h } } 
    #=> {:cars=>[{"id"=>111}, {"id"=>333}, {"id"=>888}]} 

, а затем применить to_json.

0

Возможно, это поможет.

Вы можете создать этот хеш, как этот.

car_hash = {:cars => (['id']*(ids.size)).zip(ids).map {|k, v| { k => v} }} 

Вы можете преобразовать это в json так.

require 'json' 
car_hash.to_json 
1

Так что было не совсем ясно, хотите ли вы преобразовать свои идентификаторы в строки или нет. Я предполагал, что нет, но если вы хотите, чтобы они были как строки, просто добавьте .to_s к вызову i на карте.

Итак, работая назад с выхода, я вижу, что у вас есть хэш с одним ключом, значение представляет собой массив хэшей идентификатора ключа. Из этого я делаю эквивалентную структуру ruby, hash => массивы хешей.

require 'json' 
{ cars: [111,333,888].map do |i| 
    { id: i } 
    end 
}.to_json 
=> "{\"cars\":[{\"id\":111},{\"id\":333},{\"id\":888}]}" 

Если вы находитесь в рельсах, вам не нужно требовать json.

С рубином, поскольку все это объект, вы можете сделать это эффективно однострочным. Учитывая отсутствие контекста, я не могу сказать, имеет ли это смысл или нет.

Если вы находитесь в объекте, вы можете захотеть отделить построение хешей идентификаторов новым методом и вызвать это. Если это Rails и идентификаторы, на самом деле в отношениях ActiveRecord, что вы захватывая, вы можете сделать что-то вроде этого:

{ users: User.select(:id).first(3) }.to_json 
    User Load (0.3ms) SELECT `users`.`id` FROM `users` ORDER BY `users`.`id` ASC LIMIT 3 
=> "{\"users\":[{\"id\":1},{\"id\":2},{\"id\":3}]}" 

явно не идеальный матч, чтобы ваш случай, но вы должны быть в состоянии бежать оттуда.

Смежные вопросы