簡體   English   中英

來自rails ActiveRecord find_by_sql調用的結果的列順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM