[英]Column order of results from rails ActiveRecord find_by_sql call
我正在嘗試整理一些基本的報告屏幕。 我有一些相當復雜的SQL查詢,我正在使用ActiveRecord的find_by_sql方法。 我在這里遇到的問題是我丟失了原始查詢中給出的列的順序。 我假設這是因為Hash類不保留其鍵的輸入順序。
有沒有解決這個問題的方法? 我應該使用不同的方法然后find_by_sql查詢我的問題嗎?
我喜歡使用Ruport進行報告。 它具有良好的ActiveRecord集成,它使您能夠控制列順序和其他任何東西。 而且使用起來非常簡單,即使對於“基本”報告,我也不認為它有點過分。
你是正確的,因為Ruby Hash不保留順序。 這是關鍵點的一部分,實際上 - 您使用密鑰訪問它。
我假設您的查詢是按照您想要輸出它們的順序傳遞列的,並且您希望通過循環輸出值? 看起來像一個體面的想法,但我想不出一種方法來實現它,至少沒有一些額外的工作。
我建議的是在模板中按鍵顯式訪問列,因為你可能最終應用樣式,使用諸如number_with_delimiter之類的輔助函數進行格式化。
為了得到類似上面提到的快捷方式,我想你可以按照所需的順序創建一個符號數組,並在循環中將值從哈希中拉出來。 像這樣的東西? (請原諒潛在的狡猾的錯誤:我是一個haml用戶!)
<% for row in @report.rows %>
<tr>
<% for col in [:a, :b, :c] %>
<td><%= row[col] %></td>
<% end %>
</tr>
<% end %>
在rails 3.2及更高版本中,您可以對find_by_sql
結果的每條記錄使用attribute_names
。 這在find_by_sql中有記錄:
對數據庫執行自定義SQL查詢並返回所有結果。 結果將作為一個數組返回,並將請求的列封裝為您調用此方法的模型的屬性。 如果調用
Product.find_by_sql
則結果將在具有您在SQL查詢中指定的屬性的Product
對象中返回。如果調用跨越多個表的復雜SQL查詢,則SELECT指定的列將是模型的屬性,無論它們是否是相應表的列
對於模型,您可以使用column_names。 有關變體的更多信息,請參閱其他SA答案: 如何在Rails中發現模型屬性
你是如何創建這些“報告屏幕”的? 他們是erb模板嗎? 您是否只是在列上調用.each將它們全部打印出來?
如果是這種情況,您可以覆蓋模型中的columns()方法以返回有序數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.