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)
,这对于对任意对象进行简单计数非常方便。
我试图将我的投票模型的结果放入散列中以供进一步使用,但我不知道如何从 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)
,这对于对任意对象进行简单计数非常方便。