我必须创建28个名为以下的数组:
all_questions_1 = []
all_questions_2 = []
...
all_questions_28 = []
我不想手动创建它们,因此我试图找出如何以大量失败的尝试来动态创建它们。
我检查了先前的问题,但收效甚微。
Ruby dynamically naming arrays
在阅读评论后,我添加了关于为什么我问这个问题的其他解释
我要解决的是Ruby_on_Rails controller
中存在一个名为replies
的自定义操作的问题
操作如下:
def replies
@project = Project.find(params[:project_id])
@paper = Paper.find(params[:paper_id])
@replies = Question.where("project_id = ? AND paper_id = ?", params[:project_id], params[:paper_id])
end
@replies
会返回一个长对象,其中包含项目中每篇论文的所有答复。
因此,一篇论文可以被多个用户回答。每篇论文都在一个项目中。每个项目包含几篇论文。
(用户可以用NA,NO,MAYBE,YES回答所有28个问题,我将其翻译为“ -1”,“ 0”,“ 0.5”,“ 1”)
现在,一旦我有了它。我必须绘制所有28条回复/问题。我要执行以下操作。
@replies.map do |reply|
all_question_1 << reply.question_1.to_i
end
我想做28次(有28个问题),这就是为什么我需要28个数组。我这样做是因为我希望将可能是字符串"-1", "0", "0.5", "1"
的答案更改为数字-1, 0, 0,5, 1
一旦这样做,我想为每个问题(all_question_1,all_question_2 ... all_question_28)计算包含多少个-1或0或0.5或1的问题。
总结:
我需要构建28次以下代码,将name_of_array_ [NUMBER]从1更改为28:
all_question_1 = []
@replies.map do |reply|
all_question_1 << reply.question_1.to_i
end
na_question_1 = all_question_1.count(-1)
no_question_1 = all_question_1.count(0)
maybe_question_1 = all_question_1.count(0.5)
yes_question_1 = all_question_1.count(1)
len_question_1 = all_question_1.length
我不想手动进行操作,因此我想知道是否有一种方法可以将_NUMBER从1动态更改为28。
答案 0 :(得分:1)
使用动态变量是我从未发现过的需要。您应该找到另一个数据结构来存储它们(例如,数组数组)。
例如,
all_questions_arrays = 28.times.map { |i| [i] }
print all_questions_arrays[20]
# => [20]
答案 1 :(得分:1)
您可以像这样动态创建28个实例变量:
1.upto(28){ |i| instance_variable_set("@all_questions_#{i}", [])}
通过@
符号访问28个变量之一。例如@all_questions_3
答案 2 :(得分:0)
根据您在问题中遇到的第一个链接,我认为这是最好的方法,看起来像这样。
hash = Hash.new
28.times do |counter|
hash[:"all_questions_#{counter + 1}"] = @replies.pluck(:"question_#{counter + 1}").map(&:to_i)
end
您最终将得到一个哈希,哈希的键与您想要的命名约定匹配,并且值是填充有来自每个@replies的问题值的数组。当您想从哈希中获取特定数组时,可以这样做
hash[:all_questions_1] # returns [1, -1, 0, ....]