Ruby,从MySQL2 :: result对象创建哈希,我可以从中获取数据

时间:2018-01-08 14:49:01

标签: arrays ruby hash mysql2

我有一个MySQL2 :: Result对象@available_items

@available_items.each do |row| puts row.values.join("\t   ") end

给我一​​些看起来像这样的东西:

+------------+--------------+----------------------------------+
|    tdate   |   whatDay    |              items               |
+------------+--------------+----------------------------------+
| 2018-01-02 |    Tuesday   |    OL,BD,DM,WW,DG                |
| 2018-01-03 |    Wednesday |    KP,LW                         |
| 2018-01-04 |    Thursday  |    LW,WW,FS,DG                   |
| 2018-01-05 |    Friday    |    OL,KP,BD,SB,LW,DM,AS,WW,FS,DG |
| 2018-01-06 |    Saturday  |    OL,KP,BD,SB,LW,DM,AS,WW,FS,DG |
+------------+--------------+----------------------------------+

嗯,实际上它看起来像其他东西,但希望你能得到这个想法。

我知道默认的MySQL2结果输出是一个哈希值,但我无法弄清楚如何通过引用第1列中的日期来引用第3列中的项目(即使用tdate作为keyitems设为value。)

所以我创造了一些,感觉就像,#34;脏"使用pluck方法创建数组的代码

@available_items.each do |row|
@available_array[0] = @available_items.pluck("tdate")
@available_array[1] = @available_items.pluck("whatDay")
@available_array[2] = @available_items.pluck("items")
end

现在我有一个数组,我可以通过引用数组来调用,但我真正想要的是hash其中tdate是键,items是值,所以对于任何给定日期,我可以随机从items中的逗号分隔列表中拉出一个(缩写的)项目,并将该单个项目放入新的哈希值(伪代码)中,然后使用某些哈希值检查该哈希值其他代码。

@final_list = hash.new()
@final_list[:tdate] = items(randomSelection)

如果我尝试按如下方式创建哈希:

@available_hash = Hash.new()
@available_items.each do |row|
@keyis = @available_items.pluck("tdate")
@valueis = @available_items.pluck("available")
@available_hash[@keyis] = @valueis
end

然后再做

@available_hash.each_with_index do |k, v| puts "#{k} : #{v}" end

我明白了:

[[#<Date: 2018-01-02 ((2458121j,0s,0n),+0s,2299161j)>, #<Date: 2018-01-03 ((2458122j,0s,0n),+0s,2299161j)>, #<Date: 2018-01-04 ((2458123j,0s,0n),+0s,2299161j)>, #<Date: 2018-01-05 ((2458124j,0s,0n),+0s,2299161j)>, #<Date: 2018-01-06 ((2458125j,0s,0n),+0s,2299161j)>], nil] : 0

看起来它刚刚把所有东西都送到了一行。

我有一种感觉,我试图过于复杂,而且我误解了如何附加到哈希。

所以问题是:如何为每个{key,value}事物看起来像{tdate: items}创建一个哈希值,每个日期都有一对新事件。

提前致谢。

2 个答案:

答案 0 :(得分:0)

试试这个。

@available_hash = @available_items.map{|item| [item["date"], item["items"]] }.to_h

希望这有帮助。

答案 1 :(得分:0)

将其添加为比隐藏在评论中更明显的答案:

@available_hash = @available_items.map do |h| {h["tdate"] => h["available"] } end