Rails模型结果以散列-变量为关键问题

Rails model results to hash - variable as a key issue

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

通常我得到一个错误:

undefined method `member?' for nil:NilClass

但它来自无法识别的 target_hash[cv.content_id],我怎样才能让变量被识别 target_hash[cv.content_id] ??

我认为您的代码可以归结为:

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 值,这意味着您错过了这些值。

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

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