からアクションを変更しまし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
が、ビルド時に頻繁に呼び出される次の 2 つのメソッドのそれぞれを理論的に高速化するかどう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
(私は「理論的に」と言います。質問はベンチマークでも答えられる可能性があるためです。しかし、そこまで到達する前に、理論が正しいかどうかを確認したいと思います。)