Преобразование хэша внутри массива в хэш с несколькими значениями из одного ключа - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь загрузить данные из redis db. У меня есть приложение API только рельсы и пытается отобразить данные JSON в соответствии с требованиями. В настоящее время я могу get данные из Redis в следующем формате.

[
 {
  "id": 1,
  "name": "Stephenie Meyer",
  "created_at": "2018-04-17T07:40:50.417Z",
  "updated_at": "2018-04-17T07:40:50.417Z"
 },
 {
  "id": 2,
  "name": "V.C. Andrews",
  "created_at": "2018-04-17T07:40:50.613Z",
  "updated_at": "2018-04-17T07:40:50.613Z"
 },
 {
  "id": 3,
  "name": "Sophie Kinsella",
  "created_at": "2018-04-17T07:40:50.646Z",
  "updated_at": "2018-04-17T07:40:50.646Z"
 }
]

Как можно преобразовать это таким образом, чтобы пары значений ключа name, created и updated были хешем для пары id ключ-значение.

В это

 {"id": 1,
    {
      "name": "Stephenie Meyer",
      "created_at": "2018-04-17T07:40:50.417Z",
      "updated_at": "2018-04-17T07:40:50.417Z"
    }
 }

вспомогательный метод для получения данных redis.

def fetch_authors
    authors = $redis.get('authors')
    if authors.nil?
      authors = Author.all.to_json
      $redis.set("authors", authors).to_json
      $redis.expire("authors", 5.hour.to_i)
    end
    JSON.load authors
end

И отображение на странице индекса с помощью

def index
    @authors = fetch_authors
    render json: @authors
  end

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Не совсем то, что вы хотите, потому что это неправильный синтаксис, но вы можете добиться чего-то похожего с group_by

arr = [
  {
    "id": 1,
    "name": "Stephenie Meyer",
    "created_at": "2018-04-17T07:40:50.417Z",
    "updated_at": "2018-04-17T07:40:50.417Z"
  },
  {
    "id": 2,
    "name": "V.C. Andrews",
    "created_at": "2018-04-17T07:40:50.613Z",
    "updated_at": "2018-04-17T07:40:50.613Z"
  },
  {
    "id": 3,
    "name": "Sophie Kinsella",
    "created_at": "2018-04-17T07:40:50.646Z",
    "updated_at": "2018-04-17T07:40:50.646Z"
  }
]

arr.group_by { |e| e[:id] }

Это вернет

{
    1 => [
        {
                    :id => 1,
                  :name => "Stephenie Meyer",
            :created_at => "2018-04-17T07:40:50.417Z",
            :updated_at => "2018-04-17T07:40:50.417Z"
        }
    ],
    2 => [
        {
                    :id => 2,
                  :name => "V.C. Andrews",
            :created_at => "2018-04-17T07:40:50.613Z",
            :updated_at => "2018-04-17T07:40:50.613Z"
        }
    ],
    3 => [
        {
                    :id => 3,
                  :name => "Sophie Kinsella",
            :created_at => "2018-04-17T07:40:50.646Z",
            :updated_at => "2018-04-17T07:40:50.646Z"
        }
    ]
}
0 голосов
/ 03 мая 2018

Наиболее близким к тому, что вы хотите, вероятно, будет:

input = ...
input.map { |hash| [hash.delete(:id) || hash.delete('id'), hash] }.to_h

#⇒ {{1=>{:name=>...},
#   {2=>{:name=>...},
#   {3=>{:name=>...}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...