2009-10-05 29 views
2

如果我有T-SQL(或存儲過程)從多個表返回記錄(也許使用DBI),有沒有辦法讓我手動實例化ActiveRecord模型及其關聯?很顯然,我在數據庫性能之後。我希望能夠構建自己的對象層次結構(模型及其關係),但是當我完成所有工作時,我希望每個模型都能正常運行。也就是說,我希望這可以在沒有可能導致我的結構行爲異常的黑客攻擊下完成。手動實例化ActiveRecord模型及其關係?

編輯:

這是有點做作,但它確實說明了如何一個查詢可以返回數據n級深(其中「n」只有實際限制),並在一個調用返回一切到數據庫:

SELECT * FROM customers 
    WHERE id = 1; 

SELECT * FROM orders 
    WHERE customer_id = 1; 

SELECT * FROM lineitems 
    WHERE order_id IN (
    SELECT id FROM orders 
    WHERE customer_id = 1 
); 

然後擁有所有的記錄,我會簡單地映射我自己的關聯。通過ActiveRecord和:include來做這件事的問題是,它會多次訪問數據庫而不是僅僅一次 - 隨着「n」的增加,更多的是徵稅。

+0

我是否正確理解您想要獲取SQL查詢的結果並從它們實例化ActiveRecord對象? – 2009-10-05 15:28:56

+0

是的,還有協會。 – Mario 2009-10-06 00:06:09

+0

如果仔細觀察,您最後的查詢實際上不會返回訂單和客戶,它只是返回lineitems。如果你需要這3個查詢來獲得assosciations,那麼它與使用include相同:include with ActiveRecord – Staelen 2009-10-06 02:02:32

回答

0

如果我明白你在做什麼,你試圖一次執行多個sql查詢,並且仍然會像通常那樣返回所有實例化的模型。

你真正想要的是:

Customer.find(:all, :include => {:orders => :lineitems}) 

這將獲取所有記錄您在單個查詢興趣和創造AR對象正確。

+0

我應該補充說,任何比這更復雜的東西(比如存儲過程)可能會浪費你的時間。這聽起來像你正試圖過早優化。你會花費你所有的時間在這裏或那裏幾毫秒(無論如何,這可能無關緊要),永遠不會完成/啓動一個產品。 – 2009-10-20 16:18:17

+0

你說得對 - 我放棄了不成熟的優化。我有一些結構不能真正由:include選項處理,因爲多層次的多態關係。拿你的榜樣。如果「訂單」是一個多態對象,有時有線條,有時不是?這不是一個很好的例子,我承認,但是同樣的,我提出了:包括無用的。 – Mario 2009-10-21 11:59:21

+0

現在已經有幾年了,但是我現在有一個類似的小船,我有一個現有的應用程序,在頁面加載時查詢花費了30秒以上,這絕對是一個問題。我可以通過整理SQL大量減少這一點,但我無法在ActiveRecord一側看到解決這個問題的方法。 – glenatron 2014-08-18 15:31:17