2009-11-06 42 views
1

是否有ActiveRecord執行自定義SQL查詢並讓它返回一個數組的數組,其中第一行是列名稱,每個後面的行是行數據?我要執行類似:如何獲得ActiveRecord查詢結果中的行和列?

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

並使其返回:

[["id","name","email"],["1","Bob Johnson","[email protected]"],["2","Joe Smith","[email protected]"]] 

這將允許我打印自定義查詢結果以HTML表是這樣的:

<table> 
    <% result.each_with_index do |r,i| %> 
    <tr> 
     <% r.each do |c| %> 
     <% if i == 0 %> 
      <th><%=h c %></th> 
     <% else %> 
      <td><%=h c %></td> 
     <% end %> 
     <% end %> 
    </tr> 
    <% end %> 
</table> 

請注意,select_all不起作用,因爲每個散列中的鍵都是無序的,所以您已經失去了查詢中指定的結果排序。

回答

2

不正是你要找的,但也許:

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

,你會回來

[{:id => 1, :name => 'Bob', :email => '[email protected]'},{:id => 1, :name => 'Joe', :email => '[email protected]'}] 

,你可以這樣做:

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會將結果集的每一行作爲數組(像迭代器一樣工作)。再次

編輯:

OK,這裏是一個很好的解決方案,修改任何DB你使用:

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 
+0

不,不工作,因爲哈希鍵無序 – pjb3

+0

的查詢並不總是會SELECT *。他們可能會有一些列或列的子集根據聚合計算等。我更新了問題以使其更清楚。 – pjb3

+1

是的,all_arrays正是我所期待的。希望那裏有一些非適配器特定的東西,但我確定爲sqlite,postgres和mysql開發並不難。謝謝! – pjb3

相關問題