在每个循环内/多个循环中向哈希添加值

时间:2018-11-22 15:54:27

标签: ruby-on-rails

我有一个名为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"]

我现在想做的是构造我的哈希,以便每个单独的快照事件都包含一个namedateownership_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 :(得分:1)

您必须为该对象创建一个新的哈希,并将该哈希附加到正在创建的对象数组中。

  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时使用默认值。