我有一个名为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个属性的哈希?
感谢指导/帮助-谢谢!
答案 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
时使用默认值。