Добавление значений в хеш в пределах или более нескольких циклов - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть концепция под названием snapshot, которая в основном хранит снимок того, как данные выглядели в определенный период времени.То, что я создаю, - это метод, который перебирает моментальные снимки для каждого события и создает небольшой хэш, в котором с течением времени определяется принадлежность данного акционера.

  def fetch_ownership_over_time(shareholder, captable)

    @shareholder = Shareholder.find(shareholder.id)
    @captable = Captable.find(captable.id)
    @company = @captable.company.id
    @ownership_over_time = []

    @captable.events.collect(&:snapshot).each do |snapshot|
      parsed_snapshot = JSON.parse(snapshot)

      @ownership_over_time.push(parsed_snapshot["event"]["name"])
      @ownership_over_time.push(parsed_snapshot["event"]["date"])

      parsed_snapshot["shareholders"].each do |shareholder|
        if shareholder["id"] == @shareholder.id

          @ownership_over_time.push(shareholder["ownership_percentage"]) 

        end
      end
    end
    return @ownership_over_time
  end

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

["Event 1 ", "2018-11-19", "0.666666666666667", "Event 2 ", "2018-11-19", "0.333333333333333", "4th event ", "2018-11-19", "0.315789473684211"]

Что бы я хотел сделать сейчас, хотяЭто построить мой хэш так, чтобы каждое отдельное событие снимка содержит name, date и ownership_percentage.

Возможно, что-то вроде этого:

ownership_over_time = [
    {
    event_name = "Event 1" #parsed_snapshot["event"]["name"]
    event_date = "20180202" #parsed_snapshot["event"]["date"]
    ownership_percentage = 0.37 #shareholder["ownership_percentage"]
    },
    {
    event_name = "Event 2" #parsed_snapshot["event"]["name"]
    event_date = "20180501" #parsed_snapshot["event"]["date"]
    ownership_percentage = 0.60 #shareholder["ownership_percentage"]
    }
]

Моя задача, однако, заключается в том, что атрибуты ["event"]["name"] и ["event"]["date"] мне нужно извлекать при циклическом выполнении моих снимков, то есть первого цикла (.each do |snapshot|) тогда как я получаю ownership_percentage при циклическом переключении между акционерами - второй цикл (.each do |shareholder|).

Итак, мой вопрос - как я могу построить этот хеш в «двух» местах, чтобы я мог вернуть хеш с 3 атрибутами?

Благодарность за руководство / помощь - спасибо!

1 Ответ

0 голосов
/ 22 ноября 2018

Вы должны создать новый хэш для объекта и добавить этот хэш к массиву создаваемых вами объектов.

  def fetch_ownership_over_time(shareholder, captable)

    @shareholder = Shareholder.find(shareholder.id)
    @captable = Captable.find(captable.id)
    @company = @captable.company.id
    @ownership_over_time = []

    @captable.events.collect(&:snapshot).each do |snapshot|
      parsed_snapshot = JSON.parse(snapshot)
      shareholder = parsed_snapshot['shareholders'].select { |s| s['id'] == @shareholder.id }.first

      local_snapshot = {
        'event_name' => parsed_snapshot['event']['name'],
        'event_date' => parsed_snapshot['event']['date'],
        'ownership_percentage' => shareholder.try(:[], "ownership_percentage") || 0
      }

      @ownership_over_time.push local_snapshot
    end
    return @ownership_over_time
  end

Обратите внимание, что я изменил ваш второй цикл на select.Как и сейчас, вы рискуете нажать два процента, если id найден дважды.

РЕДАКТИРОВАТЬ:

Добавлена ​​функциональность для использования значения по умолчанию, если не найдено shareholder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...