如何使用ActiveRecord获取查询结果中的行和列?

有没有办法让ActiveRecord执行自定义SQL查询并让它返回一个数组数组,其中第一行是列名,后面的每一行是行数据? 我想执行类似的事情:

connection.select_rows_with_headers "SELECT id, concat(first_name, ' ', last_name) as name, email FROM users" 

让它回归:

 [["id","name","email"],["1","Bob Johnson","bob@example.com"],["2","Joe Smith","joe@example.com"]] 

这将允许我在HTML表中打印自定义查询的结果,如下所示:

 

请注意, select_all不起作用,因为每个哈希中的键都是无序的,因此您丢失了查询中指定的结果顺序。

不完全是你想要的,但也许:

 connection.execute('select * from users').all_hashes 

你会回来的

 [{:id => 1, :name => 'Bob', :email => 'bob@example.com'},{:id => 1, :name => 'Joe', :email => 'joe@example.com'}] 

你可以这样做:

 results = connection.execute('select * from users').all_hashes munged_results = [] columns = results.first.keys.map(&:to_s) munged_results << results.first.keys.map(&:to_s) munged_results += results.map{|r| columns.map{|c| r[c]} } 

类似的东西

编辑:

 results = connection.execute('select * from users').all_hashes munged_results = [] columns = User.column_names munged_results << columns munged_results += results.map{|r| columns.map{|c| r[c]} } 

应该正确订购。

除此之外,还有从#execute返回的结果对象,可以查询信息位。 像#fetch_fields这样的方法可以按顺序获取字段,而#fetch_row会将结果集的每一行作为数组(像迭代器一样工作)。

再次编辑:

好的,这是一个很好的解决方案,修改你正在使用的任何数据库:

 class Mysql::Result def all_arrays results = [] results << fetch_fields.map{|f| f.name} while r = fetch_row results << r end results end end 

这将使他们没有大量的开销。

像这样用它:

 connection.execute('select salt, id from users').all_arrays