在mysql的散列中使用日期作为键的ruby

3df52oht  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(212)

我有一个散列,它是 .map mysql2::result对象上的方法,如下所示: {#<Date: 2018-01-02 ((2458121j,0s,0n),+0s,2299161j)>=>"OL,BD,DM,WW,DG"} {#<Date: 2018-01-03 ((2458122j,0s,0n),+0s,2299161j)>=>"KP,LW"} {#<Date: 2018-01-04 ((2458123j,0s,0n),+0s,2299161j)>=>"LW,WW,FS,DG"} {#<Date: 2018-01-05 ((2458124j,0s,0n),+0s,2299161j)>=>"OL,KP,BD,SB,LW,DM,AS,WW,FS,DG"} {#<Date: 2018-01-06 ((2458125j,0s,0n),+0s,2299161j)>=>"OL,KP,BD,SB,LW,DM,AS,WW,FS,DG"} 我想通过引用键从散列中提取值(两个字母的项)。
我试过了

puts hash_name["2018-01-06"]
puts hash_name['2018-01-06']
puts hash_name[Date.new(2018,1,6)]
puts hash_name["<Date: 2018-01-06 ((2458125j,0s,0n),+0s,2299161j)>"]
puts hash_name["#<Date: 2018-01-06 ((2458125j,0s,0n),+0s,2299161j)>"]

全部不返回任何内容或错误。
通过执行以下操作创建哈希:

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

在创建散列的过程中,我可以做些什么,或者现在,我可以使用一些简单的方法来提取值,例如,我可以将它转换成其他的日期格式,比如iso格式吗?
谢谢

um6iljoc

um6iljoc1#

显然hashMap不适合作为日期的键,hashMap更适合作为id、tag等键,它应该是唯一的键。
请提供更多关于您需要如何处理此哈希Map的信息,以确保您可以拥有更聪明的数据结构。
如果有一个包含两个键(tdate、items)的数组,并且要查找日期,请使用select:

result = available_items.select { |elem| elem['tdate'] === Date.new(2001,2,3) }

日期类中“==”运算符的引用http://ruby-doc.org/stdlib-2.1.1/libdoc/date/rdoc/date.html#method-i-3d-3d-3d

fslejnso

fslejnso2#

希望这能帮助其他人做类似的事情,下面是我最后做的。
我有一个mysql2::result对象,如上图所示,我在其上运行:

@available_hash = @available_items.map do |row|
[ row["tdate"], row["available"] ]
end.to_h

曾宣布 start_date 和一个 end_date 然后,我从列表中随机选择一个可用项,以使用日期作为键填充新哈希:

$final_hash = Hash.new("")
for date in (start_date..end_date)
@available_today = @available_hash[date].to_s.split(",")
$final_hash[date] = random_item(@available_today)
date +=1;
end

虽然我相信可能有一个更优雅的方式来做这件事,我很高兴你帮助我得到这个工作!

vwhgwdsa

vwhgwdsa3#

我想你的问题是 Enumerable#map 不是你想的那样。这是:

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

将为您提供一个单条目哈希数组,各个哈希将日期Map到字符串,但结果如下所示:

[
  { date1 => string1 },
  { date2 => string2 },
  ...
]

而不是:

{
  date1 => string1,
  date2 => string2,
  ...
}

如你所料。切换到 #each_with_object 你应该解决你的问题:

hash_name = @available_items.each_with_object({}) do |row, h|
  h[row['tdate']] = row['items']
end
fivyi3re

fivyi3re4#

你很接近这里,但是你正在生成一个散列数组,而不是一个单数散列:

hash_name = @available_items.map do |i|
  [ i["tdate"], i["items"] ]
end.to_h

这将创建一个键/值对数组数组,然后使用 .to_h 方法。
你也可以使用 group_by 如果您的输入数据可以整齐地分组,例如:

hash_name = @available_items.group_by do |i|
  i['tdate']
end

如果您可以处理输出格式,那么这种方法就足够了。它是按日期键入的。
请注意,使用符号键 :tdate 以及 :items 通常优于字符串键。值得一试的是,在大多数情况下,如果不是这样的话,这些弦就会大量重复出现。

相关问题