2012-05-31 9 views
9

Aquí está el código que estoy usando:¿Cómo puedo iterar a través de un conjunto de resultados de MySQL?

# Run the query against the database defined in .yml file. 
# This is a Mysql::result object - http://www.tmtm.org/en/mysql/ruby/ 
@results = ActiveRecord::Base.connection.execute(@sql_query) 

en mi opinión, esto es lo que hago para ver los valores:

<pre><%= debug @results %></pre> 
Outputs: #<Mysql2::Result:0x007f31849a1fc0> 

<% @results.each do |val| %> 
    <%= val %> 
<% end %> 
Outputs: ["asdfasdf", 23, "qwefqwef"] ["sdfgdsf", 23, "asdfasdfasdf"] 

así que imagina lo consulto algo así como select * from Person, y que devuelve una conjunto de resultados como:

ID  Name  Age 
1  Sergio 22 
2  Lazlow 28 
3  Zeus  47 

¿Cómo puedo repetir cada valor y emitirlo?

La documentación aquí no es útil porque he probado métodos que supuestamente existen, pero el intérprete me da un error diciendo que esos métodos no existen. ¿Estoy usando la documentación incorrecta?

http://www.tmtm.org/en/mysql/ruby/

Gracias!

Respuesta

23

Si está utilizando joya mysql2, entonces debería estar recibiendo el objeto de resultado mysql2 y de acuerdo a la documentación que debe ser capaz de hacer lo siguiente

results.each do |row| 
    # conveniently, row is a hash 
    # the keys are the fields, as you'd expect 
    # the values are pre-built ruby primitives mapped from their corresponding field types in MySQL 
    # Here's an otter: http://farm1.static.flickr.com/130/398077070_b8795d0ef3_b.jpg 
end 

Pedido la documentación here

Así en ti Si puede hacer lo siguiente

<% @results.each do |val| %> 
    <%= "#{val['id']}, #{val['name']}, #{val['age']}" %> 
<% end %> 

Editar: usted parece estar refiriéndose al documento incorrecto, verifique el documento de gemas de Mysql2.

+0

¡Muchas gracias! No puedo creer que estaba leyendo los documentos incorrectos. :) –

+5

Probablemente trabajó demasiado tomar un descanso. – Josnidhin

+1

Niza nutria .... – RTF

2

Uso :as => :hash:

raw = ActiveRecord::Base.connection.execute(sql) 
raw.each(:as => :hash) do |row| 
    puts row.inspect # row is hash 
end 
+0

¿Cuál es el beneficio de usar '(: as =>: hash)' y no solo '.each'? – Termato

+1

@Termato En mi computadora portátil (Windows 7), Rails 3, no da salida 'row' como hash, así que explícitamente agrego' (: as =>: hash) '. Totalmente de acuerdo solo usa '.each' si funciona :) – coderz

+0

Gracias, eso es muy útil. – Termato

6

Usted podría tratar de usar en lugar de ActiveRecord::Base.connection.exec_queryActiveRecord::Base.connection.execute que devuelve un ActiveRecord::Result (disponible en rieles 3.1 +)

A continuación, puede acceder a ella de diversas maneras como .rows, .each, o .to_hash

a partir del docs:

result = ActiveRecord::Base.connection.exec_query('SELECT id, title, body FROM posts') 
result # => #<ActiveRecord::Result:0xdeadbeef> 


# Get the column names of the result: 
result.columns 
# => ["id", "title", "body"] 

# Get the record values of the result: 
result.rows 
# => [[1, "title_1", "body_1"], 
     [2, "title_2", "body_2"], 
     ... 
    ] 

# Get an array of hashes representing the result (column => value): 
result.to_hash 
# => [{"id" => 1, "title" => "title_1", "body" => "body_1"}, 
     {"id" => 2, "title" => "title_2", "body" => "body_2"}, 
     ... 
    ] 

# ActiveRecord::Result also includes Enumerable. 
result.each do |row| 
    puts row['title'] + " " + row['body'] 
end 
1

Busque @ results.fields para encabezado de columna.

Ejemplo: @results = [[1, "Sergio", 22], [2, "Lazlow", 28], [3, "Zeus", 47]]

@results.fields do |f| 
    puts "#{f}\t" # Column names 
end 

puts "\n" 

@results.each do |rows| # Iterate through each row 
    rows.each do |col| # Iterate through each column of the row 
    puts "#{col}\t" 
    end 
    puts "\n" 
end 

Esperamos que sea servicial.

Cuestiones relacionadas