如何使用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