在尝试创建这个散列idea_benefit_count时,我遇到了几个语法和零问题。
@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 has_many domains,所以@idea应该是具有给定@domain的所有想法。
@idea_evaluations是belong_to特定idea的所有评估的数组。
@idea_benefit是一个数组,它保存每个评估的所有benefit条目。输出示例:[["happier_customers"], ["happier_employees"], ["happier_employees", "decreased_costs"], ["happier_employees"]]
idea_benefit_count读取idea_benefit,并计算出每种想法都有多少好处。基于上述idea_benefit_count数组的idea_benefit输出为{"happier_customers"=>1, "decreased_costs"=>1, "happier_employees"=>3}。
(希望这个上下文涵盖了一切)
我当前的错误是行undefined method 'benefit'上的@idea_benefit << eval.benefit。Benefit是evaluation的一个属性,因此它应该输出类似于["happier_customers"]的内容。
我意识到这段代码有点乱七八糟,所以任何建议都会极大地帮助整个工作。一个大问题是检查是否存在属于evaluations的idea,因为如果返回nil,它会抛出一个错误。试图用if !@idea_evaluations.nil?检查来修复这个问题,但由于undefined method 'benefit'错误,还未能对其进行测试。
编辑
@idea_evaluations = Array.new()
@idea.each do |idea|
@idea_evaluations << idea.evaluations
end
@idea_evaluations.flatten!
@idea_benefit = []
unless !@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发布于 2015-06-14 04:23:56
如果我理解您正在尝试做什么,我看到的问题是将idea.evaluations转储到@idea_evaluations中的方式。
@idea_evaluations将是一组评价数组,而不是您所认为的一组评估。
例如[[eval1,eval2],[eval3,eval4,eval5]]而不是[eval1, eval2, eval3, eval4, eval5]
当您尝试访问福利时,它会尝试为不存在的数组寻找一个效益方法。
试着改变
@idea.each do |idea|
@idea_evaluations << idea.evaluations
end成为
@idea.each do |idea|
@idea_evaluations << idea.evaluations
end
@idea_evaluations.flatten!另外,在红宝石你通常不做
if !condition 你通常会
unless condition发布于 2015-06-14 04:54:40
使用map构建数组(或ActiveRecord作用域以提高效率)。
@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)inject是一个有用的工具来总结信息。
@idea_benefits .inject({}) do |eval, result|
result[eval] += 1
result
end发布于 2015-06-14 06:31:26
我相信这个完整的片段可以被以下内容所取代:
@idea_benefit_count =
@idea.flat_map(&:evaluations)
.flat_map(&:benefit)
.each_with_object(Hash.new{0}) {|k, h| h[k] += 1}https://stackoverflow.com/questions/30825849
复制相似问题