Найти ключ и значение в хэше - PullRequest
0 голосов
/ 27 августа 2018

У меня есть массив хэшей:

b = [
  {
    id: 2,
    Sector: "Crops",
    2011-12: 17.6,
    2012-13: 18.9,
    2013-14: 14.2,
    2014-15: 13.1,
    2015-16: 12.3,
    2016-17: 12.1,
    created_at: "2018-08-27T06:11:29.000Z",
    updated_at: "2018-08-27T06:11:29.000Z"
  }
]

Я получаю этот массив из моей базы данных.

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

[
  {
    y: 17.6,
    label: "2011-12"
  },
  {
    y:18.9,
    label: "2012-13",
    ...
  }
]

Я пытаюсь этот код:

u = []
b.each do |col|
  u.push({y:25, label:"2011"})
  u.push({y:35, label:"2012"})
end

Это создает новый массив, как я ожидал, но когда я пытаюсь получить ключ и значение, используя:

b.each do |col|
  col.each do |key, value|
    puts "The hash key is #{key} and the value is #{value}."
  end
end

Я получаю эту ошибку:

undefined method `each' for

Что с этим не так?Как я могу получить ключ и значение любого хэша и как использовать его в моем случае?

Как я вижу, ошибка 2011-12: 17.6, 2011-12 должна быть строкой.Но я получаю это значение из БД.Как решить эту проблему, если я хочу создать массив в своем формате.

Итак, моя проблема в том, что мои имена столбцов находятся в 2012-13, и когда я выполняю запрос, я получаю значение, как оно есть.

Я получаю это при использовании b.inspect:

 #<ActiveRecord::Relation [#<AnnualStateDomesticProduct3 id: 2, Sector: "Crops", 2011-12: 17.6, 2012-13: 18.9, 2013-14: 14.2, 2014-15: 13.1, 2015-16: 12.3, 2016-17: 12.1, created_at: "2018-08-27 06:11:29", updated_at: "2018-08-27 06:11:29">]>

Мои миграции для этой таблицы:

def change
create_table :annual_state_domestic_product3s do |t|
  t.string :Sector
  t.float :'2011-12'
  t.float :'2012-13'
  t.float :'2013-14'
  t.float :'2014-15'
  t.float :'2015-16'
  t.float :'2016-17'

  t.timestamps
end

Поэтому мой вопрос заключается в том, как получить значение вформат строки?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Учитывая следующий хеш (не массив, обратите внимание на кавычки, заключающие ключи, как указано).

h = {
      id: 2,
      Sector: "Crops",
      "2011-12": 17.6,
      "2012-13": 18.9,
      "2013-14": 14.2,
      "2014-15": 13.1,
      "2015-16": 12.3,
      "2016-17": 12.1,
      created_at: "2018-08-27T06:11:29.000Z",
      updated_at: "2018-08-27T06:11:29.000Z"
    }

Это единственный способ получить требуемый результат.

h.delete_if { |k,v| [:id, :Sector, :created_at, :updated_at].include? k }
.each_with_object([]) { |pair, ary| ary << { y: pair.last, label: pair.first } }

# => [{:y=>17.6, :label=>:"2011-12"}, {:y=>18.9, :label=>:"2012-13"}, ... ]

Возможно, вам нужно изменить массив ключей для удаления на ['id', 'Sector', 'created_at', 'updated_at']

Если у вас есть массив хэшей (ваша b переменная), сопоставьте каждый элемент с предоставленным кодированным кодом:

result = array_of_hashes.map do |h|
  h.delete_if { |k,v| [:id, :Sector, :created_at, :updated_at].include? k }
  .each_with_object([]) { |pair, ary| ary << { y: pair.last, label: pair.first } }
end

РЕДАКТИРОВАТЬ - Получение правильного массива хэшей из базы данных

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

#<ActiveRecord::Relation [#<AnnualStateDomesticProduct3 id: 2, Sector: "Crops", 2011-12: 17.6, 2012-13: 18.9, 2013-14: 14.2, 2014-15: 13.1, 2015-16: 12.3, 2016-17: 12.1, created_at: "2018-08-27 06:11:29", updated_at: "2018-08-27 06:11:29">]>

Один из обходных путей - преобразовать в JSON, а затем разобрать в хеш, как уже указывалось в одном комментарии:

b = JSON.parse(AnnualStateDomesticProduct.all.to_json)

Кроме того, чтобы получить значение атрибута от объекта, вы можете «вызвать столбец» следующим образом:

a = AnnualStateDomesticProduct.find(2)
a.send('2011-12') # => 17.6
0 голосов
/ 27 августа 2018

, как говорит hermanvicente, 2011-12 не является действительным хеш-ключом (это выражение).Должен быть заключен в кавычки.

b = [
  {
    id: 2,
    "Sector": "Crops",
    "2011-12": 17.6,
    "2012-13": 18.9,
    "2013-14": 14.2
  }
]

b.each do |col|
  col.each do |key, value|
    puts "The hash key is #{key} and the value is #{value}."
  end
end

print

The hash key is id and the value is 2.
The hash key is Sector and the value is Crops.
The hash key is 2011-12 and the value is 17.6.
The hash key is 2012-13 and the value is 18.9.
The hash key is 2013-14 and the value is 14.2.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...