急切地加载嵌套关联,belongs_to和has_one

时间:2012-11-27 12:27:29

标签: ruby-on-rails ruby-on-rails-3

在我的应用中,学生在问题集或测验中都会遇到问题。例如,当学生在问题集上出现问题时,会在该问题/用户上更新两个统计信息 - 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_statps.first.problem_stat.problem_type而无需执行其他查询。但是,当我ps.first.problem_type时,它会再做一次查询。有什么方法可以解决这个问题,而不会将我的.problem_type更改为.problem_stat.problem_type s?

1 个答案:

答案 0 :(得分:2)

在这种情况下,没有急切加载has_one关系的原因是因为它被定义为模型上的单独关系。每个关系都是独立的,所以即使通过它“通过”另一种关系,你仍然需要明确地包含它。

problem_set_stats.includes({:problem_stat => :problem_type}, :problem_type)