Rails将结果模型化为哈希 - 变量作为关键问题

时间:2017-04-24 21:16:05

标签: ruby-on-rails ruby ruby-hash

我试图将我的投票模型的结果放在哈希中以供进一步使用,但我不知道如何从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] ??

1 个答案:

答案 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),这对于做任意对象的简单计数器来说非常方便。