Создание вложенных хэшей из вложенного массива - PullRequest
0 голосов
/ 07 декабря 2018

Я бы хотел превратить ответ от следующего запроса:

sites = Site.find(request.review_sites).pluck(:id, :location_id, :site_name, :review_url,:created_at)

, который выдает вывод, как показано ниже,

[
  [
    50,
    2,
    "google",
    "https://search.google.com/local/writereview?placeid=000000001flMRNRVr8YpJWuY",
    Thu, 06 Dec 2018 20:18:29 UTC +00:00
  ],
  [
    51,
    2,
    "facebook",
    "https://www.facebook.com/biz/reviews/?ref=page_internal",
    Thu, 06 Dec 2018 20:18:35 UTC +00:00
  ]
]

во вложенный хеш, как показано ниже (который яЯ буду работать с JSON чуть позже):

{
  :google => {
    :id => 50,
    :create_at => "2018-12-06T20:18:29.651Z",
    :site_name => "google",
    :review_url => "https://search.google.com/local/writereview?placeid=00000000001flMRNRVr8YpJWuY",
    :location_id => 2
  },
  :facebook => {
    :id => 51,
    :create_at => "2018-12-06T20:18:35.639Z",
    :site_name => "facebook",
    :review_url => "https://www.facebook.com/biz/reviews/?ref=page_internal",
    :location_id => 2
  }
}

Я понимаю, что это дубликат, но я изо всех сил пытаюсь реализовать некоторые ответы.Я изо всех сил пытаюсь сделать это программно, поэтому любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 07 декабря 2018

Пусть ваш массив будет array.В Ruby <2.6 вы можете получить хеш по: </p>

array.map do
  |id, location_id, site_name, review_url, create_at|
  [site_name.to_i, {
    id: id,
    create_at: create_at,
    site_name: site_name,
    review_url: review_url,
    location_id: location_id,
  }].to_h
end

В Ruby 2.6 вы можете получить по:

array.to_h do
  |id, location_id, site_name, review_url, create_at|
  [site_name.to_i, {
    id: id,
    create_at: create_at,
    site_name: site_name,
    review_url: review_url,
    location_id: location_id,
  }]
end
0 голосов
/ 07 декабря 2018

В вашем случае pluck не может быть подходящим инструментом для работы.

Если у вас есть контроль над этим, я бы изменил его на что-то вроде ниже (разделенных на несколько логических строк просто для удобства).

collection = Site.find(request.review_sites)
columns = [:id, :location_id, :site_name, :review_url, :created_at]
sites = collection.select(columns).map { |v| [v.id, v.attributes] }.to_h

Использование select возвращает необходимые атрибуты в виде хэша, а затем вы можете отобразить его так, как вам нравится.Преобразование в json будет тогда делом sites.to_json.

0 голосов
/ 07 декабря 2018

Я получил то, что вы ищете,

Попробуйте выполнить следующее,

sites = Site.find(request.review_sites)
          .as_json(only: [:id, :location_id, :site_name, :review_url,:created_at])
          .group_by { |x| x['site_name'] }

Выведите на экран лайки,

{
  'google' => [
    {
      'id' => 50,
      'create_at' => "2018-12-06T20:18:29.651Z",
      'site_name' => "google",
      'review_url' => "https://search.google.com/local/writereview",
      'location_id' => 2
    },
    {
      'id' => 52,
      'create_at' => "2018-14-06T20:18:29.651Z",
      'site_name' => "google",
      'review_url' => "https://search.google.com/local/readerview",
      'location_id' => 3
    }
  ],
  'facebook' => [
    {
      'id' => 51,
      'create_at' => "2018-12-06T20:18:35.639Z",
      'site_name' => "facebook",
      'review_url' => "https://www.facebook.com/biz/reviews/?ref=page_internal",
      'location_id' => 2
    }
  ]
}
0 голосов
/ 07 декабря 2018

Я решил это благодаря этому ответу от @ dcarneiro

Вот как я создал вложенные хэши из вложенных массивов для тех, кто находит это.

      review_sites = Site.find(request.review_sites).pluck(:id, :location_id, :site_name, :review_url,:created_at)
      sites_hash = Hash[review_sites.map do |site| 
        [site[2], Hash['id', site[0], 'location_id', site[1], 'site_name', site[2], 'review_url', site[3], 'create_at', site[4] ]]
      end]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...