在我的应用中,学生在问题集或测验中都会遇到问题。例如,当学生在问题集上出现问题时,会在该问题/用户上更新两个统计信息 - 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_type
更改为.problem_stat.problem_type
s?
答案 0 :(得分:2)
在这种情况下,没有急切加载has_one关系的原因是因为它被定义为模型上的单独关系。每个关系都是独立的,所以即使通过它“通过”另一种关系,你仍然需要明确地包含它。
problem_set_stats.includes({:problem_stat => :problem_type}, :problem_type)