Я думаю, что вы ищете, скажем, если у нас есть категория 1, категория 2 и категория 3, вы хотите, чтобы все элементы принадлежали к любой из этих категорий. Это верно?
Это может быть решено с помощью итераций или ручных условий для одного запроса, но звучит как работа для has_many :through
.
class Store < ActiveRecord::Base
has_many :items, :through => :categories
end
После этого @store.items
должен вернуть все предметы, принадлежащие к любой из категорий магазина. У магазина есть связь с определенными предметами через объект категории.
Если вы опасаетесь создавать такие отношения (хотя это определенно самый простой и наименее хрупкий путь), вы также можете сделать это процедурно. Наивным подходом было бы запустить метод items
для каждой категории и поместить все результаты в один массив, но при этом один запрос на категорию выполнялся бы: печально известная проблема N + 1. Если есть 50 категорий, то это 50 запросов только для получения элементов. Вам лучше всего выполнить один запрос, чтобы найти нужные элементы:
@items = Item.where(:category_id => @categories.map(&:id)).all
(я не полностью уверен, что это синтаксис Arel для классического предложения SQL WHERE…IN
, но я думаю, что это так.)
@categories.map(&:id)
возвращает массив идентификаторов всех категорий, который передается как условие для category_id
элемента. Итак, на английском языке: «найти все элементы, где category_id находится в этом списке идентификаторов категории»
Итак, есть два решения с одним запросом, которые работают примерно одинаково хорошо. Перейти на тот, который чувствует себя чище для вас:)