2013-06-19 154 views
1

我剛剛更改了操作中competitors_controller.rb從...這是渴望加載做我認爲它應該做什麼?

def audit 
    @review = Review.find(params[:review_id]) 
    @competitor = @review.competitors.find(params[:id]) 
    respond_with(@review, @competitor) 
end 

...到...

def audit 
    @review = Review.find(params[:review_id]) 
    @competitor = Competitor.find(params[:id], :include => {:surveys => {:question => [:condition, :precondition]}}) 
    respond_with(@review, @competitor) 
end 

...在頁面上被加載超時。

底層的關聯是:

class Competitor < ActiveRecord::Base 
    has_many :surveys 
end 

class Survey < ActiveRecord::Base 
    belongs_to :competitor 
    belongs_to :question 
    delegate :dependencies, :precondition, :condition, :to => :question 
end 

class Question < ActiveRecord::Base 
    has_many :dependancies, :class_name => "Question", :foreign_key => "precondition_id" 
    belongs_to :precondition, :class_name => "Question" 
    has_many :surveys, :dependent => :delete_all 
end 

基本上,audit.html.haml頁面加載:

@competitor.surveys.{sorting, etc}.each do |s| 
    s.foo, s.bar 
    s.{sorting, etc}.dependant_surveys.each do |s2| 
     s2.foo, s2.bar 
     s2.{sorting, etc}.dependant_surveys.each do |s3| 
      s3.foo, s3.bar, etc etc 

如果我窩太遠,頁面沒有之前加載時間出。

我需要知道的是,我是否已經在competitor_controllers.rb理論上加速了以下兩種方法中的每一種,在構建audit.html.haml時經常調用這些方法?

class Survey < ActiveRecord::Base 
    def dependant_surveys 
    self.review.surveys.select{|survey| self.dependencies.include?(survey.question)} 
    end 
end 

class Question < ActiveRecord::Base 
    def dependencies 
    Question.all.select{|question| question.precondition == self} 
    end 
end 

(我說「理論上」,因爲我知道這個問題也可以用基準的回答。但在此之前我走到這一步我想檢查我的理論正確的。)

回答

1

你在ruby中做了很多處理,而且沒有必要這麼做。您應將所有操作如

Question.all.select{|question| question.precondition == self} 
@competitor.surveys.{sorting, etc} 

移動到數據庫。

如果我理解正確,第一行是爲了選擇所有具有給定問題前提條件的記錄。請記住,Question.all返回一個數組,因此您可以在數組中執行select操作,並且您可以在db中執行該操作,其範圍僅爲scope :has_precondition, -> {|q| where(precondition_id: q.id}

鑑於您始終以相同方式對模型進行排序,您可以考慮使用order子句創建默認範圍。用紅寶石做它是非常有效的。

1

的預先加載的外觀像它應該工作,但更重要的是,這些是你可以並應該使用SQL來做的事情。加載並遍歷數據庫中的所有ActiveRecord模型可能會非常耗時(正如您找到的那樣),而如何在SQL中實現它將允許您直接從單個查詢加載所有模型。這可能需要一段時間才能掌握,但它非常值得!

0

據我所知,你只能加入關聯加載。我不認爲你有什麼將會工作。您沒有向我們展示Question.condition的定義,或Survey.review。此外,您正在加載的關聯在您執行自己的查詢時將不會被您的方法dependent_surveysdependencies使用。

AFAICT您的急切加載不會造成任何差異,或者它可能會減慢速度。我想你必須重構你的dependent_surveys作爲一種關聯和熱切的加載。我沒有絲毫的線索知道該方法試圖在高層次上做什麼,所以我甚至不會試圖重構它。

相關問題