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行目に次のエラーが表示されます:正規表現を整数に変換できません

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 が列を返す順序が変更され、SELECT *以前は機能していたコードが壊れる可能性があります。

于 2013-04-04T09:14:57.610 に答える