Загрузка связанных данных в одном запросе

#ruby-on-rails

#ruby-on-rails

Вопрос:

Это, вероятно, ужасное название, но оно продолжается.

У меня есть две модели: Item и Category. Это отношение «многие ко многим» (элементы могут принадлежать нескольким категориям, категории могут содержать несколько элементов).

Каков наилучший способ поиска (например, по имени) списка категорий и поиска всех элементов, включенных в них? Если бы я использовал SQL, я бы сделал что-то вроде следующего:

 SELECT * FROM items
WHERE category_id in (
   SELECT id FROM category
   WHERE name IN ('cat1', 'cat2', 'cat3')
)
 

или что-то в этом роде, но я бы хотел сделать это по-железнодорожному, если это возможно.

Спасибо!

Ответ №1:

Вы можете сделать

 Item.joins(:categories).where("categories.name" => ['cat1', 'cat2', 'cat3'])
 

Ответ №2:

Редактировать

Item.includes(:categories).where("categories.name IN(?)", list_of_names)

Комментарии:

1. Бесполезно — я начинаю со списка «имен», а не идентификаторов. Сначала нужно просмотреть идентификаторы — достаточно просто, если мы используем два отдельных запроса, но я надеюсь сделать это с помощью одного.

2. SQLite3:: SQLException: нет такого столбца: category.name : ВЫБЕРИТЕ ПУНКТ «элементы».* ИЗ «элементов», ГДЕ (category.name IN(‘музыка’)) — результат этого кода. Редактировать: изменение включений на объединения исправлено 🙂 Спасибо вам и пользователю 229688.