Как я могу пройти через набор результатов 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)
На мой взгляд, вот что я делаю, чтобы увидеть значения:
<pre><%= debug @results %></pre>
Outputs: #<Mysql2::Result:0x007f31849a1fc0>
<% @results.each do |val| %>
<%= val %>
<% end %>
Outputs: ["asdfasdf", 23, "qwefqwef"] ["sdfgdsf", 23, "asdfasdfasdf"]
Итак, представьте, что я запрашиваю select * from Person
, и это возвращает набор результатов, таких как:
ID Name Age
1 Sergio 22
2 Lazlow 28
3 Zeus 47
Как я могу перебрать каждое значение и вывести его?
Документация здесь бесполезна, потому что я попробовал методы, которые предположительно существуют, но интерпретатор выдает мне ошибку, говоря, что эти методы не существуют. Я использую неправильную документацию?
http://www.tmtm.org/en/mysql/ruby/
Спасибо!
4 ответа
Если вы используете gem mysql2, вы должны получить объект результата mysql2, и в соответствии с документами вы сможете сделать следующее
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
Ознакомьтесь с документацией здесь
Так что в вашем случае вы можете сделать следующее
<% @results.each do |val| %>
<%= "#{val['id']}, #{val['name']}, #{val['age']}" %>
<% end %>
Изменить: вы, похоже, ссылаетесь на неправильный документ, проверьте документ Mysql2 gems.
Вы можете попробовать использовать ActiveRecord::Base.connection.exec_query
вместо ActiveRecord::Base.connection.execute
который возвращает ActiveRecord::Result
(доступно в рельсах 3.1+)
Тогда вы можете получить к нему доступ различными способами, такими как .rows
, .each
, или же .to_hash
Из документов:
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
Использование :as => :hash
:
raw = ActiveRecord::Base.connection.execute(sql)
raw.each(:as => :hash) do |row|
puts row.inspect # row is hash
end
Ищите @results.fields для заголовка столбца.
Пример: @results = [[1, "Серхио", 22],[2, "Лазлоу", 28],[3, "Зевс", 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
Надеюсь, это полезно.