【问题标题】:Ruby, create hash from MySQL2::result object that I can pluck data out ofRuby,从 MySQL2::result 对象创建哈希,我可以从中提取数据
【发布时间】:2018-01-08 14:49:00
【问题描述】:

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

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

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

+------------+--------------+---------- -------------+ |日期 |什么日子 |项目 | +------------+--------------+---------- -------------+ | 2018-01-02 |星期二 | OL,BD,DM,WW,DG | | 2018-01-03 |星期三 | KP,LW | | 2018-01-04 |星期四 | LW,WW,FS,DG | | 2018-01-05 |星期五 | OL,KP,BD,SB,LW,DM,AS,WW,FS,DG | | 2018-01-06 |星期六 | OL,KP,BD,SB,LW,DM,AS,WW,FS,DG | +------------+--------------+---------- -------------+

嗯,实际上它看起来像别的东西,但希望你能明白。

我知道默认的 MySQL2 结果输出是哈希,但我不知道如何通过引用第 1 列中的日期来引用第 3 列中的项目(即使用 tdate 作为 @987654324 @ 得到itemsvalue。)

所以我用 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},每个日期都有一个新对。

提前致谢。

【问题讨论】:

    标签: arrays ruby hash mysql2


    【解决方案1】:

    试试这个。

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

    希望这会有所帮助。

    【讨论】:

    • 抱歉,这不太行,但@available_hash = @available_items.map do |h| {h["tdate"] =&gt; h["available"] } end 行了。
    • @busfender 很高兴听到这个消息。我会相应地编辑答案。
    【解决方案2】:

    添加它作为比埋在 cmets 中更明显的答案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多