Ruby Inject不断返回类

Ruby Inject不断返回类,ruby,hash,Ruby,Hash,我正在运行一个简单的SQL查询以返回哈希。 虽然我可以毫不费力地使用.each方法,但我希望也可以使用.inject({})方法,但是这个方法有三分之二的时间返回nil 谁能解释我做错了什么 这是最好的。每种方法都很好 def self.availabilities(days=10) hash = {} where( 'date >= ? AND date <= ?', Date.today, Date.today + days )

我正在运行一个简单的SQL查询以返回哈希。 虽然我可以毫不费力地使用.each方法,但我希望也可以使用.inject({})方法,但是这个方法有三分之二的时间返回nil

谁能解释我做错了什么

这是最好的。每种方法都很好

  def self.availabilities(days=10)
    hash = {}
    where(
      'date >= ? AND date <= ?',
      Date.today, Date.today + days
    )
    .each do |availability|
      p availability
      if hash[availability.checker.display_name]
        hash[availability.checker.display_name] << availability.date
      else
        hash[availability.checker.display_name] = [availability.date]
      end
    end
    hash
  end
这是注入方法

.inject({}) do |hash,elmt|
  p "hash ==> #{hash}"
  puts '------------------'
  if hash[elmt.checker.display_name]
    hash[elmt.checker.display_name] << elmt.date
    hash
  else
    hash[elmt.checker.display_name] = elmt.date
    hash
  end
end
如果我尝试迭代它,它当然不起作用

谢谢你的帮助

祝你今天愉快

试试这个:

.inject({}) do |hash,elmt|
  p "hash ==> #{hash}"
  puts '------------------'
  if hash[elmt.checker.display_name]
    hash[elmt.checker.display_name] << elmt.date
    hash
  else
    hash[elmt.checker.display_name] = elmt.date
    hash
  end
end
.inject({})do| hash,elmt|
p“hash==>#{hash}”
放置'-------------'
如果散列[elmt.checker.display_name]

hash[elmt.checker.display_name]通过生成冗余的中间对象,您滥用了
inject
。除了应将元素作为块参数处理外,还应将
每个\u与\u对象一起使用
,而不是
注入
。另一个小问题是,在创建字符串时,当缺少相应的哈希元素时,应该创建一个数组

.each_with_object({}) do |elem, hash|
  (hash[elmt.checker.display_name] ||= []) << elmt.date
end
应该是:

hash[elmt.checker.display_name] = [elmt.date]

感谢您的回答,我编辑了我的原始问题,我最初尝试了两个参数,但仍然不起作用。欢迎您查看我的答案,看看这里有什么问题。请注意:看起来您正在运行N+1查询,通过使用
include
或数据库联接,您的代码的性能可能会提高很多。
checker
是默认的
属于\u:checker
关联吗
display\u name
是数据库中的一列吗?非常感谢,我想我终于得到了它。。。显然,我在尝试注射不该注射的药物
.each_with_object({}) do |elem, hash|
  (hash[elmt.checker.display_name] ||= []) << elmt.date
end
hash[elmt.checker.display_name] = elmt.date
hash[elmt.checker.display_name] = [elmt.date]