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が、ビルド時に頻繁に呼び出される次の 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

(私は「理論的に」と言います。質問はベンチマークでも答えられる可能性があるためです。しかし、そこまで到達する前に、理論が正しいかどうかを確認したいと思います。)

4

3 に答える 3

1

熱心な読み込みはうまくいくように見えますが、もっと重要なことは、これらは SQL を使用して実行できることであり、実行する必要があることです。DB 内のすべての ActiveRecord モデルを読み込んで繰り返し処理すると、信じられないほど時間がかかる可能性がありますが (ご存じのとおり)、SQL でそれを行う方法を考え出すと、すべてのモデルを単一のクエリから直接読み込むことができます。これを理解するには時間がかかるかもしれませんが、それだけの価値があります。

于 2013-06-19T12:55:33.527 に答える
0

私の知る限り、熱心な読み込みの関連付けのみを含めることができます。あなたが持っているものはまったく機能しないと思います。Question.conditionが定義されている場所、またはSurvey.review. また、熱心にロードしているアソシエーションは、メソッドによって使用されずdependent_surveysdependencies独自のクエリを実行しているためです。

AFAICT あなたの熱心な読み込みは大きな違いを生まないか、おそらく遅くなるでしょう。dependent_surveys関連付けとしてリファクタリングし、熱心にロードする必要があると思います。そのメソッドが何をしようとしているのか、大まかなレベルではまったく手がかりがないので、リファクタリングを試みるつもりさえありません。

于 2013-06-19T13:12:14.927 に答える