2012-05-31 5 views
9

Hier ist der Code Ich verwende:Wie kann ich eine MySQL-Ergebnismenge durchlaufen?

# 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) 

Meiner Ansicht, hier ist was ich tun, um die Werte zu sehen:

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

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

ich Abfrage so etwas wie select * from Person So vorstellen, und das gibt eine Ergebnismenge wie:

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

Wie kann ich jeden Wert durchlaufen und ausgeben?

Die Dokumentation hier ist nicht nützlich, weil ich Methoden versucht habe, die angeblich existieren, aber der Interpreter gibt mir eine Fehlermeldung, dass diese Methoden nicht existieren. Benutze ich die falsche Dokumentation?

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

Dank!

Antwort

23

Wenn Sie mit mysql2 gem dann sollten Sie das mysql2 Ergebnisobjekt bekommen und nach der Dokumentation sollten Sie in der Lage sein, die folgenden

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 

Kasse in die Dokumentation here

So zu tun Fall können Sie wie folgt vorgehen

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

bearbeiten: Sie scheinen zu sein Bezug auf das falsche Dokument überprüfen Sie die Mysql2 Gems doc.

+0

Vielen Dank! Ich kann nicht glauben, dass ich die falschen Dokumente gelesen habe. :) –

+5

Wahrscheinlich überarbeitete eine Pause machen. – Josnidhin

+1

Nice otter .... – RTF

2

Verwendung :as => :hash:

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

Was ist der Vorteil von '(: as =>: hash)' und nicht nur '.each'? – Termato

+1

@Termato In meinem Laptop (Windows 7), Rails 3, gibt es "row" nicht als Hash aus, also füge ich explizit '(: as =>: hash)' hinzu. Stimmen Sie völlig zu, benutzen Sie einfach ".each", wenn es funktioniert :) – coderz

+0

Danke, das ist sehr hilfreich. – Termato

6

Sie könnten versuchen, ActiveRecord::Base.connection.exec_query statt ActiveRecord::Base.connection.execute verwendet, die eine ActiveRecord::Result (erhältlich in Schienen 3.1+) gibt

Dann können Sie es auf verschiedene Weise wie .rows zuzugreifen, .each, oder .to_hash

Von der 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

Suchen Sie nach @ results.fields für die Spaltenüberschrift.

Beispiel: @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 

Hoffnung ist hilfreich.