0

期待どおりに機能するこのクエリがあります。

@dog.listings.joins(:address_country).merge(Country.where(permalink: 'uk'))

このクエリにより、国が「uk」と一致するリストが表示されます(リストhas_one:address_country、これは国モデルの国です)

しかし、猫とリスト(ごみ)の間のチェーンに別の関連付けを追加すると、機能しません(ごみはリストと猫に属します):

@dog.litters.joins(:listing) & Listing.joins(:address_country) & Country.where(permalink: 'uk')

このクエリでは、(関連するリストの)国が一致するLittersをフェッチしたいと思います。ただし、空の配列を返すだけです。最初のクエリは機能します、そして私はそれをボルトで固定する必要があると思い@cat.littersますか?)

Rails Cでは、次のようになっています。

 d.litters.joins(:listing) & Listing.joins(:address_country).merge(Country.where(permalink: 'uk'))

  Litter Load (0.6ms)  SELECT "litters".* FROM "litters" INNER JOIN "listings" ON "listings"."id" = "litters"."listing_id" WHERE "litters"."litterable_id" = 11 AND "litters"."litterable_type" = 'Dog'
  Listing Load (0.4ms)  SELECT "listings".* FROM "listings" INNER JOIN "countries" ON "countries"."id" = "listings"."address_country_id" WHERE "countries"."permalink" = 'uk'
=> []

私が間違っていることについて何か考えはありますか?

4

1 に答える 1

1

間違いなく間違っていることの1つは、それ&がと同じであると想定することですmerge。以前はそうでしたが、fbd917で削除されました。現在は、ルビーの配列の共通部分であり、それはあなたが望むものではありません。

あなたが与えた簡単な説明からデータベーススキーマに従うかどうかはわかりませんが、マージするためにそれを書き直すだけで試してみる価値があります。

@dog.litters.joins(:listing).merge(Listing.joins(:address_country)).merge(Country.where(permalink: 'uk'))

また、実際にコードを実行しなくても、これは同等だと思います。

@dog.litters.joins(listing: :address_country).where(countries: {permalink: "uk"})
于 2013-01-15T18:04:42.163 に答える