2

我一直在努力学习循环的基础知识,我已经到了那里,但我正在努力让我的大脑围绕以下要求,例如,我通过 tinytds 从数据库表中获取数据,例如关键/values 似乎被散列到一个数组中(?-这里是初学者,所以希望我的术语是正确的!):-

数据使得 db 表的一个“列”中的值重复多次,而第二个“列”的值是唯一的。

因此,与其简单地在 HTML 中为输出创建一个表,该表仅具有 2 列,其中 column1 一遍又一遍地显示同一行文本(在下一个唯一字符串列表一遍又一遍之前),我想呈现信息以便column1 中的唯一字符串值是标题,然后 column2 的值列在下面。

在我看来,我想我想要实现的是循环遍历每个唯一字符串的 column1,输出该值,同时运行一个内部循环来列出 column2 的所有值,其中 column1 是“字符串”,继续下一个column1 的唯一值,输出该值,然后再次遍历 column2 以列出 column1 为“string2”等的所有值。

希望这是有道理的,因为我正在努力知道如何用正确的术语进行解释。

谢谢。

例如,如果我的数据库表中的 2 列如下:-。

列1
Q1
Q1
Q1
Q2
Q2
Q3
Q3
Q3

列 2
A1
A2
A3
A4
A5
A6
A7
A8

我如何循环(或任何最好的)以能够呈现输出,例如:-

Q1
A1
A2
A3

Q2
A4
A5

Q3
A6
A7
A8

我可以编写 HTML 端来格式化输出,但我无法弄清楚 ruby​​ 端。

对于一个循环,我从 tiny_tds 示例中选择了以下 ruby​​(这里的 html 只是为了测试现在的位置):-

<% narrative.each do |question| %>
<span><%=question.values[1] %></span>
<br/>   
<% end %>

这使我可以列出插槽 2 的所有值(这是正确的术语吗?),我可以执行以下操作:-

<% narrative.each do |question| %>
<span><%=question.values[0] %></span><span><%=question.values[1] %></span>
<br/>   
<% end %>

并排展示两者,但我想要做的是更像: -

<h1>Question1 goes here</h1>
<ul>
<li>Answer 1</li>
<li>Answer 2</li>
<li>Answer 3</li>
</ul>
<h1>Question2 goes here</h1>
<ul>
<li>Answer 4</li>
<li>Answer 5</li>
</ul>

等等

4

2 回答 2

0

好的!我认为以下内容将帮助您实现目标:

>> Column1 = [:Q1,:Q1,:Q1,:Q2,:Q2,:Q3,:Q3,:Q3] 
=> [:Q1, :Q1, :Q1, :Q2, :Q2, :Q3, :Q3, :Q3]
>> Column2 = [:A1,:A2,:A3,:A4,:A5,:A6,:A7,:A8]
=> [:A1, :A2, :A3, :A4, :A5, :A6, :A7, :A8]
>> h = Column1.each_with_object(Hash.new(0)){|i,ob| ob[i] = ob[i] + 1 }
=> {:Q1=>3, :Q2=>2, :Q3=>3}
>> enu = Column2.to_enum
=> #<Enumerator: [:A1, :A2, :A3, :A4, :A5, :A6, :A7, :A8]:each>
>> h1 = h.each_with_object(Hash.new([])){|(k,v),ob| v.times{ ob[k] = ob[k].dup.push(enu.next) } }
=> {:Q1=>[:A1, :A2, :A3], :Q2=>[:A4, :A5], :Q3=>[:A6, :A7, :A8]}
>> h1.each{|k,v| puts k,v}
Q1
A1
A2
A3
Q2
A4
A5
Q3
A6
A7
A8
=> {:Q1=>[:A1, :A2, :A3], :Q2=>[:A4, :A5], :Q3=>[:A6, :A7, :A8]}

或者你也可以这样做:

a1 = [:Q1,:Q1,:Q1,:Q2,:Q2,:Q3,:Q3,:Q3] 
a2 = [:A1,:A2,:A3,:A4,:A5,:A6,:A7,:A8]

a3 = a1.zip(a2).group_by{|i| i[0]}
a3.each{|k,v| v.flatten!.delete(k); puts [k,v]}
于 2013-05-21T09:11:18.297 回答
0

如果你想保持简单,这样做,只是给出逻辑,而不是 puts 添加你的 html 标签

a1 = [:Q1,:Q1,:Q1,:Q2,:Q2,:Q3,:Q3,:Q3] 
a2 = [:A1,:A2,:A3,:A4,:A5,:A6,:A7,:A8]

a3 = a1.zip a2
#=>[[:Q1, :A1], [:Q1, :A2], [:Q1, :A3], [:Q2, :A4], [:Q2, :A5], [:Q3, :A6], [:Q3, :A7], [:Q3, :A8]]

a3.each_with_index do |e, i|
  puts "#{e[0] if e[0] != a3[i-1][0]} #{e[1]}"
end

=>
Q1 A1
 A2
 A3
Q2 A4
 A5
Q3 A6
 A7
 A8
于 2013-05-21T09:45:17.207 回答