Ruby动态命名控制器的数组

时间:2019-02-04 21:30:54

标签: ruby

我必须创建28个名为以下的数组:

all_questions_1 = []
all_questions_2 = []
...
all_questions_28 = []

我不想手动创建它们,因此我试图找出如何以大量失败的尝试来动态创建它们。

我检查了先前的问题,但收效甚微。

Ruby dynamically naming arrays

Ruby dynamic variable name

在阅读评论后,我添加了关于为什么我问这个问题的其他解释

我要解决的是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”)

这就是对象@replies给我的回馈。 enter image description here

现在,一旦我有了它。我必须绘制所有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。

3 个答案:

答案 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, ....]