Rails 4:与ActiveRecord进行多级联接

时间:2016-11-13 11:13:18

标签: sql ruby-on-rails join activerecord

我在数据模型中添加了另一层复杂性。先前: 一个国家有许多商店,而这些商店又拥有许多产品。

我现在介绍城市,以便: 一个国家有许多城市,有许多商店,有许多产品。

我使用的数据包含可能没有产品的商店,可能没有商店的城市(尚未拥有商店)和可能没有城市的国家(尚未)。

我想查询所有可以查找产品的国家/地区。 (即所以我可以填写所有国家/地区的目标网页,以便用户查找内容。)

以前(使用Country> Store> Product),我使用了它,并且效果很好:

Country.joins(:stores => :products).group("countries.id").having("count(products.id)>0")

但我无法理解这个额外的图层(国家>城市>商店>产品)。例如,这不起作用:

Country.joins(:cities => :stores).joins(:stores => :products).group("countries.id").having("count(products.id)>0")

...产生这个错误:

ActiveRecord::ConfigurationError: Association named 'stores' was not found on Country

有人可以帮忙吗?

(我试图尽可能地与SQL无关,所以如果可以用ActiveRecord方法完成,我想这样做。)

1 个答案:

答案 0 :(得分:2)

Country.joins(cities: [stores: :products])
       .group('countries.id')
       .having('count(products.id) > 0')

由于joins性质having条款是多余的:

Country.joins(cities: { stores: :products }).uniq