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}

我试过的

  1. 我试图在传递结果之前将结果转换为散列,但这给了我一个错误,即 .to_h 方法不存在
  2. data[:requests] = dates_init_hash.merge({requests: requests.count }) 工作到一半仍然导致错误

问题

  1. 为什么我得到一个 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}