我现在看到我误解了如何引用急切加载的数据。尽管设置正确 has_many through: ,你不能跳过第二个关联并直接访问加载的数据中的第三个。我永远无法引用其成员 @mainline.overlays 不会引发另一个查询。我必须将它们作为参考 @mainline.releases[0].overlays[0] 。
has_many through:
@mainline.overlays
@mainline.releases[0].overlays[0]
令人欣慰的消息是,我对包含的语法并不是疯了。我只是错误地使用了结果。但是,基于这种访问我的数据的方式,我已经改变了查询,使我真正感兴趣的(校准)顶级查询,如下所示:
cals = Calibration .joins(overlay: [release: :mainline]) .where(mainlines: { MainlineID: params[:id] }) .where.not(overlays: { Version: nil }) .includes(:parameter, overlay: [release: :mainline])
然后我可以循环 cals 并访问参数数据,这是我的第一步/关注。
cals
我现在也看到了角色 .joins() 根据相关值限制我的数据集。与我的相比,我当前(有限的)结果集需要3秒才能完成 .find_by_sql() 方法,只需要大约一半,并且已经包含了我还没有包含的更多模型,所以我不知道这是否能够很好地工作,但至少我明白现在正在发生什么。
.joins()
.find_by_sql()
(当然,这两种方法都存在这样的问题:一旦从浏览器传递~20K行数据,浏览器需要10秒钟才能生成表格,但那是另一种颜色的马。)