Rails:无法将Regexp转换为Integer

时间:2013-04-04 05:49:42

标签: ruby-on-rails ruby regex ruby-on-rails-3 ruby-on-rails-3.1

我的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行上给出了一个错误:无法将Regexp转换为整数

1 个答案:

答案 0 :(得分: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"

编辑:删除了我以前的“答案”,因为实际上row[0],这在Ruby中很好(我今天学到了一些东西:-)。其他东西(可能在代码中未显示)使得@ l2_mastertest散列不按预期运行。

这可能是数据库/模型问题,正如评论者所建议的那样,SELECT * FROM builds;不包含字符串。

我建议使用SELECT version, result, build_id FROM builds; 是有风险的,因为您依靠数据库按特定顺序返回列。您应该更改它以获取所需的列数据,例如。

SELECT *

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