0

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

4

1 回答 1

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

这里有很多问题,很多都与在这个过程中纠缠不清有关。target_hash您仅在 0 索引位置初始化结构的元素,但每个campaign_vote可能具有不同的content_id值,这意味着您错过了这些值。

这种方法创建了一个自动生成的哈希,它将使用计数器哈希填充键,即默认为 0 的哈希。这意味着您始终可以导航它们并且+= 1由于默认值而可以工作。

这种方法在 Ruby 中很常见,尤其是Hash.new(0),它对于对任意对象进行简单的计数器非常方便。

于 2017-04-24T21:37:15.937 回答