SQL donde el conjunto unido debe contener todos los valores pero puede contener más

Tengo tres mesasoffers, sports y la mesa de uniónoffers_sports.

class Offer < ActiveRecord::Base
  has_and_belongs_to_many :sports
end

class Sport < ActiveRecord::Base
  has_and_belongs_to_many :offers
end

Quiero seleccionar ofertas queincluir un conjunto dado de nombres deportivos. Ellosdebe contener todos lossports peromayo ten mas.

Digamos que tengo estas tres ofertas:

light:
  - "Yoga"
  - "Bodyboarding"
medium:
  - "Yoga"
  - "Bodyboarding"
  - "Surfing"
all:
  - "Yoga"
  - "Bodyboarding"
  - "Surfing"
  - "Parasailing"
  - "Skydiving"

Dada la matriz["Bodyboarding", "Surfing"] Me gustaria obtenermedium yall pero nolight.

He intentado algo en la línea deesta respuesta pero obtengo cero filas en el resultado:

Offer.joins(:sports)
     .where(sports: { name: ["Bodyboarding", "Surfing"] })
     .group("sports.name")
     .having("COUNT(distinct sports.name) = 2")

Traducido a SQL:

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;

Una respuesta de ActiveRecord sería buena, pero me conformaré con solo SQL, preferiblemente compatible con Postgres.

Datos:

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta