Правильный способ выбора связанных объектов по нескольким строкам - PullRequest
0 голосов
/ 23 мая 2019

Скажем, у меня есть 3 таблицы: Houses has_many Wardrobes has_many Clothes.

houses    wardrobes   clothes
------    ---------   -------
id        id          id
name      house_id    wardrobe_id
          name        name

Как, имея House, я могу выбрать Wardrobes, которые имеют jeans и shirt как Clothes?

Пример кода, который не работает по понятным причинам:

@house.wardrobes.joins(:clothes)
  .where("clothes.name = 'jeans'")
  .where("clothes.name = 'shirt'")

Любые ответы по SQL / ActiveRecord приветствуются.

1 Ответ

1 голос
/ 23 мая 2019

Вы можете использовать агрегацию, чтобы получить все шкафы с обоими предметами одежды:

select w.id, w.house_id
from wardrobes w join
     clothes c
     on c.wardrobe_id = w.id
where c.name in ('jeans', 'shirt')
group by w.id, w.house_id
having count(distinct c.name) = 2;

Вы можете отфильтровать по house_id в where, если вы хотите это только для одного дома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...