Ich habe drei Tabellen offers
, sports
und die Join-Tabelle offers_sports
.SQL, wo verbundener Satz alle Werte enthalten muss, aber mehr enthalten kann
class Offer < ActiveRecord::Base
has_and_belongs_to_many :sports
end
class Sport < ActiveRecord::Base
has_and_belongs_to_many :offers
end
ich wählen möchten bietet das eine gegebene Reihe von Sportnamen enthalten. Sie müssen enthalten alle sports
aber können mehr haben.
Lets sagen, ich habe diese drei Angebote:
light:
- "Yoga"
- "Bodyboarding"
medium:
- "Yoga"
- "Bodyboarding"
- "Surfing"
all:
- "Yoga"
- "Bodyboarding"
- "Surfing"
- "Parasailing"
- "Skydiving"
Da das Array ["Bodyboarding", "Surfing"]
Ich möchte medium
und all
aber nicht light
zu bekommen.
Ich habe etwas entlang der Linien von this answer versucht, aber ich bekomme keine Zeilen im Ergebnis:
Offer.joins(:sports)
.where(sports: { name: ["Bodyboarding", "Surfing"] })
.group("sports.name")
.having("COUNT(distinct sports.name) = 2")
zu SQL übersetzt:
SELECT "offers".*
FROM "offers"
INNER JOIN "offers_sports" ON "offers_sports"."offer_id" = "offers"."id"
INNER JOIN "sports" ON "sports"."id" = "offers_sports"."sport_id"
WHERE "sports"."name" IN ('Bodyboarding', 'Surfing')
GROUP BY sports.name
HAVING COUNT(distinct sports.name) = 2;
Eine Antwort Active wäre schön, aber ich werde Begleichen Sie nur SQL, vorzugsweise Postgres-kompatibel.
Daten:
offers
======================
id | name
----------------------
1 | light
2 | medium
3 | all
4 | extreme
sports
======================
id | name
----------------------
1 | "Yoga"
2 | "Bodyboarding"
3 | "Surfing"
4 | "Parasailing"
5 | "Skydiving"
offers_sports
======================
offer_id | sport_id
----------------------
1 | 1
1 | 2
2 | 1
2 | 2
2 | 3
3 | 1
3 | 2
3 | 3
3 | 4
3 | 5
4 | 3
4 | 4
4 | 5
Funktioniert die SQL? Es sieht korrekt aus. –
Es gibt 0 Zeilen zurück. @GordonLinoff – max
Sie sind fast da: gruppieren Sie nach den "Angeboten" -Feldern (ersetzen Sie die * durch explizite Feldnamen und wiederholen Sie diese in der Gruppe durch). Sie gruppieren jetzt nach sports.name und natürlich ist die eindeutige Anzahl von sports.name pro sport.name immer 1. –