2010-03-05 57 views
4

顯然,包括選擇不能在一個Rails找到查詢同時使用,這已被多次標記爲wontfix:
http://dev.rubyonrails.org/ticket/7147
http://dev.rubyonrails.org/ticket/5371Ruby on Rails:使用find_by_sql實例化相關模型?

這令我非常不方便,因爲時代我d想要使用include的時間與我想要使用select的時間完全相同 - 當性能的每一點都很重要。

有沒有什麼辦法可以解決這個問題,並手動生成一個使用find_by_sql或任何其他方法組合include-with-select?麻煩的是,我不知道有什麼方法來模擬include的功能,它在內存中實例化模型以容納包含的相關模型,這樣我就可以輸入model1.associated_models並讓它不再次訪問數據庫。

回答

4

您是否考慮過爲數據庫視圖創建模型?例如:

  • 創建數據庫視圖,您複雜的SQL查詢:

    CREATE VIEW production_plan_items AS 
        SELECT * FROM [...] 
        INNER JOIN [...]; 
    
  • 該視圖創建模型:

    # app/view_model.rb 
    class ViewModel < ActiveRecord::Base 
        self.abstract_class = true 
    
    
        def readonly? 
        true 
        end 
    
    
        def before_destroy 
        raise ActiveRecord::ReadOnlyRecord 
        end 
    end 
    
    
    # app/models/logical/production_plan_item.rb 
    module Logical 
        class ProductionPlanItem < ::ViewModel 
        end 
    end 
    
  • 用一如既往,但請記住,這些記錄是只讀!

    Logical::ProductionPlanItem.where(...) 
    

如果性能仍是今後的一個問題,你可以很容易地轉換DB意見物化使用觸發器和存儲過程的觀點。這將爲您的應用程序提供巨大的速度提升,並且您不必更改一行Rails代碼。

企業的Rails強烈推薦閱讀: http://www.amazon.com/Enterprise-Rails-Dan-Chak/dp/0596515200/ref=sr_1_1?ie=UTF8&qid=1293140116&sr=8-1