HABTM находит с помощью «И», а не «ИЛИ»
У меня есть две модели, связанные с HABTM (фактически использующий has_many: сквозной на обоих концах вместе с таблицей соединений). Мне нужно получить все ModelA, которые связаны с ОБА из двух ModelB. Я НЕ хочу, чтобы все ModelAs для ModelB_1 были объединены со всеми ModelAs для ModelB_2. Я буквально хочу все ModelA, которые связаны с ОБА ModelB_1 и ModelB_2. Он не ограничен только двумя ModelB, он может быть до 50 ModelB, поэтому он должен масштабироваться.
Я могу описать проблему, используя множество аналогий, которые, как мне кажется, лучше описывают мою проблему, чем предыдущий абзац:
* Find all books that were written by all 3 authors together.
* Find all movies that had the following 4 actors in them.
* Find all blog posts that belonged to BOTH the Rails and Ruby categories for each post.
* Find all users that had all 5 of the following tags: funny, thirsty, smart, thoughtful, and quick. (silly example!)
* Find all people that have worked in both San Francisco AND San Jose AND New York AND Paris in their lifetimes.
Я думал о множестве способов сделать это, но они крайне неэффективны и очень недовольны.
Взяв приведенную выше аналогию, скажем последнюю, вы можете сделать что-то вроде запроса для всех людей в каждом городе, а затем найти элементы в каждом массиве, которые существуют в каждом массиве. Это минимум 5 запросов, все данные этих запросов передаются обратно в приложение, а затем приложение должно интенсивно сравнивать все 5 массивов друг с другом (большое количество циклов!). Это противно, верно?
Другое возможное решение состоит в том, чтобы связать находки друг с другом, что, по сути, делает то же самое, что и выше, но не устраняет множественные запросы и обработку. Кроме того, как бы вы динамизировали цепочку, если бы вы предоставили пользовательские флажки или значения, которые могут достигать 50 вариантов? Кажется грязным. Вам нужна петля. И снова, это увеличит продолжительность поиска.
Очевидно, что, если это возможно, нам бы хотелось, чтобы база данных выполняла это за нас, поэтому люди предложили мне, чтобы я просто ввел несколько условий. К сожалению, вы обычно можете делать ИЛИ только с HABTM.
Другое решение, с которым я столкнулся, заключается в использовании поисковой системы, такой как sphinx или UltraSphinx. В моей конкретной ситуации я считаю, что это излишне, и я бы предпочел избежать этого. Я все еще чувствую, что должно быть решение, которое позволит пользователю создать запрос для произвольного числа ModelB и найти все ModelAs.
Как бы вы решили эту проблему?