Ruby on rails 在RubyonRails中创建哈希时无错误

Ruby on rails 在RubyonRails中创建哈希时无错误,ruby-on-rails,arrays,ruby,loops,ruby-on-rails-4,Ruby On Rails,Arrays,Ruby,Loops,Ruby On Rails 4,在尝试创建此哈希idea\u benefit\u count时,我遇到了几个语法和nil问题 @idea = @domain.ideas @idea_evaluations = Array.new() @idea.each do |idea| @idea_evaluations << idea.evaluations end @idea_benefit = [] if !@idea_evaluations.nil? @idea_evaluations.each do |ev

在尝试创建此哈希
idea\u benefit\u count
时,我遇到了几个语法和nil问题

@idea = @domain.ideas
@idea_evaluations = Array.new()
@idea.each do |idea|
  @idea_evaluations << idea.evaluations
end

@idea_benefit = []
if !@idea_evaluations.nil?
  @idea_evaluations.each do |eval|
    @idea_benefit << eval.benefit
  end
  @idea_benefit_count = Hash.new(0)
  @idea_benefit.flatten.each { |idea_benefit| @idea_benefit_count[idea_benefit] += 1 }
end

如果我理解你的意图,我会发现问题在于你将idea.evaluations转储到@idea\u evaluations中的方式。
@idea\u评估将是一系列评估,而不是你认为的一系列评估。
e、 g.
[[eval1,eval2],[eval3,eval4,eval5]
而不是
[eval1,eval2,eval3,eval4,eval5]

当您尝试访问价值时,它会尝试为不存在的数组查找价值方法

试着改变

@idea.each do |idea|
  @idea_evaluations << idea.evaluations
end
你通常是这样的

unless condition

使用
map
构建阵列(或使用ActiveRecord作用域以提高效率)

如果您使用范围方法,它将类似于以下内容:

# in Benefit.rb 
scope for_domain ->(domain_id){ joins(:evaluation => :idea).where(idea: {domain_id: domain_id}) }

# called like this 
@idea_benefits = Benefit.for_domain(@domain.id)
inject
是总结信息的有用工具

@idea_benefits .inject({}) do |eval, result|
  result[eval] += 1 
  result
end

我相信整个片段可以替换为:

@idea_benefit_count  = 
  @idea.flat_map(&:evaluations)
       .flat_map(&:benefit)
       .each_with_object(Hash.new{0}) {|k, h| h[k] += 1}

这给了我
SyntaxError:(irb):47:语法错误,意外的“.”。每个_与_对象(Hash.new{0}){k,h|h[k]+=1}
如果可能的话,我想用这个来让它更简洁,你知道为什么会抛出这个错误吗?可能有几件事。。。你确定你一次复制粘贴了所有内容,而不是一行一行地复制粘贴了所有内容吗?是的,我一次把所有内容都放进去了?
@idea_evaluations = @domain.ideas.map(&:evaluations)

# Remove nil values before moving on to the next chunk.
@idea_evaluations.reject! { |i| i.nil? }
@idea_benefits = @idea_evaluations.map(&:benefit)
# in Benefit.rb 
scope for_domain ->(domain_id){ joins(:evaluation => :idea).where(idea: {domain_id: domain_id}) }

# called like this 
@idea_benefits = Benefit.for_domain(@domain.id)
@idea_benefits .inject({}) do |eval, result|
  result[eval] += 1 
  result
end
@idea_benefit_count  = 
  @idea.flat_map(&:evaluations)
       .flat_map(&:benefit)
       .each_with_object(Hash.new{0}) {|k, h| h[k] += 1}