ruby-on-rails - 更新迭代器中的哈希值,所有值都将是 rails 中的最后一次迭代
问题描述
我尝试使用迭代器来更新哈希中的值,作为我创建的哈希:
@period = Date.new(2019,3,1)..Date.new(2019,3,31)
@deals = Deal.includes(:staff).where(shop_id:1, created_at:@period).group_by{|t| t.staff}
data = {}
staff_id_container = {
total:{item1: 0, item2: 0, item3: 0}
}
Staff.where(shop_id: 1).select(:id).each do |staff|
staff_id_container[staff.id] = {item1:0, item2:0, item3:0}
end
@period.each do |date|
data[date] = staff_id_container.dup
end
并且有三种方法可以更新两层嵌套结构:
1.直接替换值
@deals.each do |staff, deals_by_staff|
deals_by_staff.group_by{|t| t.created_at.to_date}.each do |date, selected_deals|
data[date][staff.id] = {
item1: select_deals.select{|deal| deal.item == "item1"}.count
item2: select_deals.select{|deal| deal.item == "item2"}.count
item3: select_deals.select{|deal| deal.item == "item3"}.count
}
end
end
2.使用合并
@deals.each do |staff, deals_by_staff|
deals_by_staff.group_by{|t| t.created_at.to_date}.each do |date, selected_deals|
data[date][staff.id].merge!({
item1: select_deals.select{|deal| deal.item == "item1"}.count
item2: select_deals.select{|deal| deal.item == "item2"}.count
item3: select_deals.select{|deal| deal.item == "item3"}.count
})
end
end
3.使用“=”声明
@deals.each do |staff, deals_by_staff|
deals_by_staff.group_by{|t| t.created_at.to_date}.each do |date, selected_deals|
data[date][staff.id][:item1] = select_deals.select{|deal| deal.item == "item1"}.count
data[date][staff.id][:item2] = select_deals.select{|deal| deal.item == "item2"}.count
data[date][staff.id][:item3] = select_deals.select{|deal| deal.item == "item3"}.count
end
end
data[date][staff.id]
第一种方法有效,但如果is{item1: 0,item2: 0,item3: 0, item4: 0}
和 the的初始值item4
将被覆盖。
第二种和第三种方式是返回错误的值,它们都让每个日期的所有值都成为最后一个日期的副本。
如上所示:
{
2019-03-01:{
staff_1:{item1: 0, item2: 3, item3: 1, item4: 5},
staff_2:{item1: 1, item2: 4, item3: 2, item4: 7},
},
2019-03-02:{
staff_1:{item1: 0, item2: 3, item3: 1, item4: 5},
staff_2:{item1: 1, item2: 4, item3: 2, item4: 7},
}
}
如果我只是想修改data[date][staff_id]
like的一个键data[date][staff_id][:item1]
或添加新键data[date][staff_id]
,我需要使用第二或第三个方式。
第二路和第三路的问题是什么?
解决方案
在构建数据时尝试替换dup
为deep_dup
data[date] = staff_id_container.deep_dup
推荐阅读
- php - CPanel 中的 CPanel 作业失败,URL 中有 % 字符
- python - 如何引用全局配置文件以在 Python 3.7 / Pandas 中过滤数据?
- html - 输入 texbox 间距 HTML
- c# - 组合框和列表框不显示文本文件的内容
- python - 使用 Python 将列中的值从浮点数舍入为整数
- java - 如何修复 Java Echo Server 中跳过的输入/输出行?
- php - 如何添加具有相同文本输入名称和单选按钮(html,php)的多个条目
- html - 未使用 @media 规则调整文本大小
- linux - yarn/npm start 使用本地开发服务器 create-react-app 给出权限错误
- azure-ad-b2c - 刷新 JWT 中的令牌