HABTM wyszukuje z połączeniami „AND”, NIE „OR”

Mam dwa modele związane z HABTM (faktycznie używające has_many: przez oba końce, wraz z tabelą łączenia). Muszę pobrać wszystkie ModelAs, które są powiązane z OBU dwóch ModelB. NIE chcę, aby wszystkie ModelAs dla ModelB_1 były połączone ze wszystkimi modelami ModelB_2. Dosłownie chcę wszystkie ModelAs, które są powiązane z BOTH ModelB_1 i ModelB_2. Nie ogranicza się tylko do 2 modeli ModelB, może mieć do 50 modeli ModelB, więc musi się skalować.

Potrafię opisać problem za pomocą różnych analogii, które moim zdaniem lepiej opisują mój problem niż w poprzednim akapicie:

* 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.

Pomyślałem o różnych sposobach, aby to osiągnąć, ale są one rażąco nieefektywne i bardzo się na nich nie patrzą.

Biorąc pod uwagę analogię powyżej, powiedzmy ostatni, możesz zrobić coś takiego jak zapytanie dla wszystkich ludzi w każdym mieście, a następnie znaleźć elementy w każdej tablicy, które istnieją w każdej tablicy. To minimum 5 zapytań, wszystkie dane z tych zapytań przeniesione z powrotem do aplikacji, a następnie aplikacja musi intensywnie porównywać wszystkie 5 tablic ze sobą (mnóstwo pętli!). To paskudne, prawda?

Innym możliwym rozwiązaniem byłoby powiązanie znalezisk jeden na drugim, co zasadniczo zrobiłoby to samo, co powyżej, ale nie wyeliminuje wielu zapytań i przetwarzania. Ponadto, w jaki sposób dynamizowałbyś łańcuch, gdyby użytkownik otrzymał pola wyboru lub wartości, które mogą być tak wysokie, jak 50 opcji? Wydaje się brudny. Potrzebujesz pętli. I znowu to zwiększyłoby czas wyszukiwania.

Oczywiście, jeśli to możliwe, chcielibyśmy, aby baza danych wykonała to dla nas, więc ludzie zasugerowali mi, że po prostu umieściłem wiele warunków. Niestety, możesz zrobić to tylko za pomocą HABTM.

Innym rozwiązaniem, z którym się spotkałem, jest użycie wyszukiwarki, takiej jak sfinks lub UltraSphinx. W mojej szczególnej sytuacji czuję, że to przesada, a wolałbym tego unikać. Nadal uważam, że powinno istnieć rozwiązanie, które pozwoli użytkownikowi stworzyć zapytanie o dowolną liczbę modeli ModelB i znaleźć wszystkie ModelAs.

Jak rozwiązać ten problem?

questionAnswers(1)

yourAnswerToTheQuestion