2

私のアプリでは、生徒は problem_sets または quizzes のいずれかで問題を解いています。たとえば、学生が問題セットで問題を解くと、その問題/ユーザーに関する 2 つの統計 (problem_set_stat と problem_stat) が更新されます。したがって、私の関係は次のとおりです。

class ProblemSetInstance
    has_one :user
    has_many :problem_set_stats
end

class ProblemSetStat
    belongs_to :problem_set
    belongs_to :problem_stat
    has_one    :problem_type, :through => :problem_stat
end

class ProblemStat
    belongs_to :problem_type
    # no has_many problem_set_stats, because I never need to access them from here currently
end

いくつかのデータベース クエリを最適化しようとしたときに、奇妙なことに遭遇しました。問題セットを表示するときは、次のクエリを使用します

ps = problem_set_stats.includes(:problem_stat => [:problem_type])

これで、追加のクエリを実行ps.first.problem_statしなくても実行できます。ps.first.problem_stat.problem_typeただし、実行ps.first.problem_typeすると、別のクエリが実行されます。すべての.problem_types を.problem_stat.problem_types に変更せずにこれを修正する方法はありますか?

4

1 に答える 1

2

その場合に has_one 関係を熱心にロードしない理由は、モデルで別の関係として定義されているためです。各リレーションシップは独立しているため、別のリレーションシップを「介して」であっても、明示的に含める必要があります。

problem_set_stats.includes({:problem_stat => :problem_type}, :problem_type)
于 2012-11-27T13:19:12.503 に答える