繁体   English   中英

远程关联的活动记录查询

[英]Active Record Query for Distant Association

记录之间有以下关系: 在此处输入图片说明

给定项目记录,我需要与该项目相关的所有资源相关的所有国家的清单。 任何国家都不应出现超过一次。

为此,可以忽略明显的性能问题,我可以向Resource添加一个方法:

  def countries
    resources.flat_map{|resource| resource.countries}.uniq
  end

我的问题有两个方面。

有没有一种以高性能的方式实现查询的方法? 如果没有,我应该如何处理这种情况?

[更新]

@MarekLipka的建议是:

resources.includes(:countries).map(&:countries).flatten.uniq

但是,这将导致60次命中,总计20个项目的0.4秒:

资源负载(1.2ms)选择“ resources”。*从“ resources”,在“ resources”。“ project_id” = 20 ORDER BY名称

ResourceLocation负载(1.0ms)选择“ resource_locations”。*从“ resource_locations”到“ resource_locations”。“ resource_id” IN(97,98,99,100,101,102,103,104,105,106,107,108, 109、110、111、112、113、114、115、116、117、118、119、120、121、122、123、124、125、126)

国家负载(0.4ms)在“ countries”中选择“ countries”。*在“ countries”。“ id” IN中(19,31,64,82,197,169,1,161,167)

[更新]

我的最新尝试是通过使用joins而不是includes来实现上述解决方案,速度约为上述解决方案的两倍,每个资源的总点击次数约为0.2秒:

Country.joins(resource_locations: {resource: :project}).where(resources: {project_id: self}).uniq

这应该没问题:

resources.includes(:countries).map(&:countries).flatten.uniq

includes方法通过预加载适当的关联来解决N + 1查询的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM