我谢了一小段代码
@item_pack = []
@pack1 = []
model_pack = {:name => {},:modellist =>[]}
data_pack = {:model =>{},:date =>[] }
model_pack[:name] = 1
data_pack[:model] = "aaa"
model_pack[:modellist] << data_pack
model_pack[:name] = 2
data_pack[:model] = "bbb"
model_pack[:modellist] << data_pack
@item_pack << model_pack
puts "#{@item_pack}"
本来意图输出是
[{:name=>2, :modellist=>[{:model=>"aaa", :date=>[]}, {:model=>"bbb", :date=>[]}]}]
但是实际输出的是
[{:name=>2, :modellist=>[{:model=>"bbb", :date=>[]}, {:model=>"bbb", :date=>[]}]}]
请问问题点在哪里?新手求教
@item_pack = []
@pack1 = []
model_pack = {:name => {},:modellist =>[]}
data_pack = {:model =>{},:date =>[] }
model_pack[:name] = 1
data_pack[:model] = "aaa"
model_pack[:modellist] << data_pack
data_pack = data_pack.dup
model_pack[:name] = 2
data_pack[:model] = "bbb"
model_pack[:modellist] << data_pack
@item_pack << model_pack
@item_pack = []
@pack1 = []
# 你的modellist要不要换成model_list……
model_pack = {name: nil, modellist: []}
data_pack = {model: nil,date: []}
model_pack[:name] = 1
data_pack[:model] = "aaa"
model_pack[:modellist] << data_pack.clone # 传值代替传引用
model_pack[:name] = 2
data_pack[:model] = "bbb"
model_pack[:modellist] << data_pack
@item_pack << model_pack
puts @item_pack # 不用放在引号里……
#4 楼 @classicalliu 谢谢,有效果不胜感激。如果可以,我再问一个问题,确认我是不是走了弯路?
其实我从数据库中查找出以下的数据
人名 1,机种 1,日期 1 人名 1,机种 1,日期 2 人名 1,机种 1,日期 3 人名 1,机种 2,日期 4 人名 2,机种 2,日期 5
我就想把数据进行整理,整理成为 一个人名对应多个机种,每个机种下又是日期的集合。我就采用了提问时的写法。这样的方法是不是有点笨?还望指教一下。
假如有个表 List,我查到了数据 lists, 人名为 name, 机种为 model, 日期为 date
result = {}
lists.each do |list|
if result[list.name].present?
if result[list.name][list.model].present?
result[list.name][list.model] << list.date
else
result[list.name][list.model] = []
result[list.name][list.model] << list.date
end
else
result[list.name] = {"#{list.model}" => date}
end
end
result
@rikiwong @classicalliu 试了有效果,真是太感谢了。看来学习 ruby 的路还很长.... 不过目前提供的方法,虽然有用,但是我不知道怎么调用。因为做表格每行中的列显示 |人名 | 机种名 | 日期 1|日期 2|日期 3|这样子的,因此就需要取得 result 内对应的 name,所以就想显示成 [{:name=>2, :modellist=>[{:model=>"aaa", :date=>[]}, {:model=>"bbb", :date=>[]}]}] 能够调用字段 上面教的方法知己就输出了 {2=>{"aaa"=>[date1,date2]}}的方式,我就有点蒙了。
result = lists.group_by(&:name).map do |name, models|
[name, models.group_by(&:model).map do |model, dates|
[model, dates.map(&:date).join(' ')]
end.to_h]
end.to_h
这样可能更简单一些?
ActiveRecord::Relation.pluck(:name, :model, :date).group_by(&:shift).transform_values { |x|
x.group_by(&:shift).transform_values(&:flatten)
}
=> {"人名1"=>{"机种1"=>["日期1", "日期2", "日期3"], "机种2"=>["日期4"]}, "人名2"=>{"机种2"=>["日期5"]}}