Глядя на то, как вы структурировали утверждение, проблема заключается в выборе диапазона - [0..3]
Выбор диапазона вернет array
, а не hash
.
При попытке извлечь ["attributes"]
из array
возникает ошибка TypeError, поскольку массивы индексируются Integer
с, а не String
с.
, чтобы исправить это, я рекомендую использовать map
функция для перебора всех экземпляров с получением значения id каждого:
json_object['resources'].select {|a| a["type"] == "aws_subnet" && a["name"] == "private"}.first["instances"][0..3].map { |inst| inst["attributes"]["id"] }
Кроме того, если вы хотите оптимизировать, я бы рекомендовал использовать find
вместо select
с последующим first
. find
ищет первый матч, который выполняет то же самое, но с лучшей производительностью.
С этим вот что вы ищете:
ids = json_object['resources'].find {|a| a["type"] == "aws_subnet" && a["name"] == "private"}["instances"][0..3].map { |inst| inst["attributes"]["id"] }
Примечание: Согласно комментарию Тана, в будущем было бы полезно включить пример ответа JSON, который вы пытаетесь проанализировать, чтобы мы могли убедиться, что ответ работает