HABTM encuentra con "Y" uniones, NO "O"

Tengo dos modelos, asociados con un HABTM (de hecho, usando has_many: a través de ambos extremos, junto con una tabla de unión). Necesito recuperar todos los ModelAs que están asociados con AMBOS de dos ModelBs. NO quiero que todos los ModelAs para ModelB_1 concatenen con todos los ModelAs para ModelB_2. Literalmente quiero todos los ModelAs asociados con BOTH ModelB_1 y ModelB_2. No se limita a solo 2 ModelB, puede ser de hasta 50 ModelB, por lo que debe escalar.

Puedo describir el problema utilizando una variedad de analogías, que creo que describe mejor mi problema que el párrafo anterior:

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

He pensado en una variedad de formas para lograr esto, pero son extremadamente ineficientes y muy mal vistos.

Tomando una analogía de arriba, digamos la última, podría hacer algo como consultar a todas las personas en cada ciudad, y luego encontrar elementos en cada matriz que existen en cada matriz. Eso es un mínimo de 5 consultas, todos los datos de esas consultas transferidas de nuevo a la aplicación, luego la aplicación tiene que comparar intensamente las 5 matrices entre sí (¡bucles en abundancia!). Eso es desagradable, ¿verdad?

Otra posible solución sería encadenar los hallazgos unos sobre otros, lo que esencialmente haría lo mismo que anteriormente, pero no eliminará las múltiples consultas y el procesamiento. Además, ¿cómo dinamizaría la cadena si los usuarios hubieran enviado casillas de verificación o valores que pudieran llegar a 50 opciones? Parece sucio. Necesitarías un bucle. Y de nuevo, eso intensificaría la duración de la búsqueda.

Obviamente, si es posible, nos gustaría que la base de datos realice esto para nosotros, por lo tanto, la gente me ha sugerido que simplemente instale varias condiciones. Desafortunadamente, solo puede hacer un OR con HABTM.

Otra solución que he encontrado es usar un motor de búsqueda, como sphinx o UltraSphinx. Para mi situación particular, siento que esto es una exageración, y prefiero evitarlo. Todavía siento que debería haber una solución que permita a un usuario elaborar una consulta para un número arbitrario de ModelB y encontrar todos los ModelA.

Como resolverías este problema?

Respuestas a la pregunta(1)

Su respuesta a la pregunta