TypeError: no implicit conversion of Fixnum into Hash - Ruby
TypeError: no implicit conversion of Fixnum into Hash - Ruby
我试过了吗google?
是的,我尝试了堆栈溢出、google、rubydocs、一堆网站,但只有 极少 结果,而且它只是间接提到过。所以是的,我做了很多搜索。
什么在起作用?
我运行以下查询:
requests = Request.where("customer_id = ?
AND request_method != ?
AND request_time
BETWEEN ? AND ?",
customer.id, "OPTIONS", start_time, end_time).group('request_time')
因此,我从数据库中得到了一堆值,看起来像这样 CORRECT:
#<ActiveRecord::Relation[#<Request id: 171792, request_time: "2022-04-04 14:07:20">,
#<Request id: 171787, request_time: "2022-04-04 14:06:02">...]
注意:我没有粘贴所有值,因为它们具有相似的结构。
有什么问题?
在查询 运行 之后,我想将它传递给变量 dates_init_hash = {}
并在计入 data[:requests]
:
时合并它
dates_init_hash = {}
(start_time.to_date..end_time.to_date).each do |date|
dates_init_hash[date] = 0
end
data[:requests] = dates_init_hash.merge(requests.count)
不幸的是,我似乎总是得到错误:
ERROR -- : TypeError: no implicit conversion of Fixnum into Hash
预期
我应该得到如下所示的哈希:
{ "2022-03-24"=>2, "2022-03-25"=>1, "2022-03-28"=>3, "2022-03-29"=>11}
我试过的
- 我试图在传递结果之前将结果转换为散列,但这给了我一个错误,即
.to_h
方法不存在
data[:requests] = dates_init_hash.merge({requests: requests.count })
工作到一半仍然导致错误
问题
- 为什么我得到一个 Fixnum,为什么它不起作用?我该如何改进呢?解决这个问题的正确方法是什么?我感谢任何形式的帮助。
为什么会出现错误?
你收到错误是因为当你 运行:
data[:requests] = dates_init_hash.merge(requests.count)
dates_init_hash
是一个散列,requests.count
是一个数字。所以你试图将一个数字合并到一个散列中,这是不允许的。
我该如何解决?
如果您想要 dates_init_hash
映射 date => number of requests that date
,您可以执行以下操作:
# initializes dates_init_hash with desired dates
dates_init_hash = {}
(start_time.to_date..end_time.to_date).each do |date|
dates_init_hash[date.iso8601] = 0
end
# iterates over reuests and add 1 to the date in dates_init_hash for each request in the desired date
requests.each do |request|
date = Date.parse(request[:request_time]).iso8601
next if dates_init_hash[date].nil?
dates_init_hash[date] += 1
end
然后,dates_init_hash
会变成
{"2022-04-04"=>1, "2022-04-05"=>0, "2022-04-06"=>1, "2022-04-07"=>0}
我试过了吗google?
是的,我尝试了堆栈溢出、google、rubydocs、一堆网站,但只有 极少 结果,而且它只是间接提到过。所以是的,我做了很多搜索。
什么在起作用?
我运行以下查询:
requests = Request.where("customer_id = ?
AND request_method != ?
AND request_time
BETWEEN ? AND ?",
customer.id, "OPTIONS", start_time, end_time).group('request_time')
因此,我从数据库中得到了一堆值,看起来像这样 CORRECT:
#<ActiveRecord::Relation[#<Request id: 171792, request_time: "2022-04-04 14:07:20">,
#<Request id: 171787, request_time: "2022-04-04 14:06:02">...]
注意:我没有粘贴所有值,因为它们具有相似的结构。
有什么问题?
在查询 运行 之后,我想将它传递给变量 dates_init_hash = {}
并在计入 data[:requests]
:
dates_init_hash = {}
(start_time.to_date..end_time.to_date).each do |date|
dates_init_hash[date] = 0
end
data[:requests] = dates_init_hash.merge(requests.count)
不幸的是,我似乎总是得到错误:
ERROR -- : TypeError: no implicit conversion of Fixnum into Hash
预期
我应该得到如下所示的哈希:
{ "2022-03-24"=>2, "2022-03-25"=>1, "2022-03-28"=>3, "2022-03-29"=>11}
我试过的
- 我试图在传递结果之前将结果转换为散列,但这给了我一个错误,即
.to_h
方法不存在 data[:requests] = dates_init_hash.merge({requests: requests.count })
工作到一半仍然导致错误
问题
- 为什么我得到一个 Fixnum,为什么它不起作用?我该如何改进呢?解决这个问题的正确方法是什么?我感谢任何形式的帮助。
为什么会出现错误?
你收到错误是因为当你 运行:
data[:requests] = dates_init_hash.merge(requests.count)
dates_init_hash
是一个散列,requests.count
是一个数字。所以你试图将一个数字合并到一个散列中,这是不允许的。
我该如何解决?
如果您想要 dates_init_hash
映射 date => number of requests that date
,您可以执行以下操作:
# initializes dates_init_hash with desired dates
dates_init_hash = {}
(start_time.to_date..end_time.to_date).each do |date|
dates_init_hash[date.iso8601] = 0
end
# iterates over reuests and add 1 to the date in dates_init_hash for each request in the desired date
requests.each do |request|
date = Date.parse(request[:request_time]).iso8601
next if dates_init_hash[date].nil?
dates_init_hash[date] += 1
end
然后,dates_init_hash
会变成
{"2022-04-04"=>1, "2022-04-05"=>0, "2022-04-06"=>1, "2022-04-07"=>0}