0

我的 Rails 控制器中有以下代码:

@main_mastertest = $connection.execute("SELECT * FROM builds;")

@l2_tmp_mastertest = Array.new
@l2_tmp_mastertest = @main_mastertest.map {|y|[y[0]]}

@l2_mastertest = Array.new
@l2_mastertest = @l2_tmp_mastertest.inject(Hash.new(0)) { |hash,element|
hash[element] +=1
hash }

@l2_mastertest = @l2_mastertest.sort_by { |x, _| x }.reverse

在那之后,我尝试在我看来做这样的事情:

<% @l2_mastertest.each_with_index do |row1, index1| %> 
   <% @l2_mastertest.each_with_index do |row2, index2| %> 
       <% if row2[0][ /(\d+\.\d+)/ ].to_s == row1[0].to_s %>      # LINE X
         ..................
       <% end %>
   <% end %>
<% end %>

但它在 X 行给了我一个错误说:can't convert Regexp into Integer

4

1 回答 1

1

如果我模拟我认为您问题中的数据结构正在发生的事情,我会得到:

@l2_mastertest = { '3.1.4' => 7, '1.2.3' => 8 }
 => {"3.1.4"=>7, "1.2.3"=>8}

@l2_mastertest.each_with_index { |row2,index| p row2,index }
["3.1.4", 7]
0
["1.2.3", 8]
1

所以一个结构就像row2[0][ /(\d+\.\d+)/ ]是一样的,例如"3.1.4"[ /(\d+\.\d+)/ ]

编辑:删除了我之前的“答案”,因为实际上"3.1.4"[ /(\d+\.\d+)/ ] => "3.1",这在 Ruby 中很好(我今天学到了一些东西:-)。其他东西(可能在未显示的代码中)使@l2_mastertest 散列的行为不符合预期。

这可能是一个数据库/模型问题,正如评论者所建议的那样,row[0]它不包含字符串。

我建议这样做SELECT * FROM builds;是有风险的,因为您依赖数据库以特定顺序返回列。您应该更改它以获取您需要的列数据,例如

SELECT version, result, build_id FROM builds;

这样您就可以确定以后的处理正在处理您认为的列。简单地重新构建或传输数据库可能会更改 RDBMS 返回 a 中的列的顺序,SELECT *并使以前工作的代码中断。

于 2013-04-04T09:14:57.610 回答