2016-11-13 17 views
1

私のデータモデルにもう1つの複雑なレイヤーを追加します。以前: カントリーには多くのストアがあり、多くの商品がありました。Rails 4:ActiveRecordを使用した複数レベルの結合

ように、私は今の都市を紹介しています: A国は、多くの製品を持っている多くの店舗を持っている多くの都市があります。

私が一緒に仕事データは、都市を(まだ)持っていないかもしれません(まだ)店舗や国を持っていないかもしれません(まだ)製品を持っていない可能性が店舗、都市が含まれています。

商品を見つけるすべての国をクエリしたいと思います。

以前は(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の方法で行うことができます。)

+0

あなたはそれを稼働させましたか? –

+0

はい、しかし、異なるアプローチで: 'Country.joins(:都市=> {:店=>:製品})uniq'一切の都市は、店舗や商品が見つからないすべての国を捨てるようだ 。 。 – rubykatz

+0

右のように、ジョインはすでに商品を持つ店舗のある都市の国しか返さないため、「持っている」は冗長です –

答えて

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

をためjoins自然having句の冗長です:

Country.joins(cities: [stores: :products]).uniq 
関連する問題