我试图将我的投票模型的结果放在哈希中以供进一步使用,但我不知道如何从Ruby中的变量创建哈希键。见下面的例子:
def create_hash_array(campaign_votes)
target_hash = Hash.new
campaign_votes.each_with_index do |cv,i|
target_hash[cv.content_id] = {} if i == 0
if target_hash[cv.content_id].member?(cv.vote_button_id)
target_hash[cv.content_id][cv.vote_button_id] = (target_hash[cv.content_id][cv.vote_button_id]).to_i + 1
else
target_hash[cv.content_id] = {cv.vote_button_id => nil}
end
end
target_hash
end
通常我收到错误:
未定义的方法`成员?'为零:NilClass
但它来自无法识别的target_hash[cv.content_id]
,如何才能使变量被识别target_hash[cv.content_id]
??
答案 0 :(得分:3)
我认为您的代码可以归结为:
def create_hash_array(campaign_votes)
target_hash = Hash.new { |h,k| h[k] = Hash.new(0) }
campaign_votes.each do |cv|
target_hash[cv.content_id][cv.vote_button_id] += 1
end
target_hash
end
这里存在多个问题,很多问题都与纠缠在一起的过程有关。您仅在0索引位置初始化target_hash
结构的元素,但每个campaign_vote
可能具有不同的content_id
值,这意味着您错过了这些值。
这种方法创建了一个自动生成Hash,它将使用计数器哈希填充键,即哈希值默认为0.这意味着您可以随时导航它们,+= 1
将因默认值而起作用。
这种方法在Ruby中很常见,特别是Hash.new(0)
,这对于做任意对象的简单计数器来说非常方便。