HABTM findet mit UND-Verknüpfungen, NICHT mit ODER

Ich habe zwei Modelle, die einem HABTM zugeordnet sind (tatsächlich wird has_many verwendet: an beiden Enden durch, zusammen mit einer Verknüpfungstabelle). Ich muss alle ModelAs abrufen, die BEIDEN ModelBs zugeordnet sind. Ich möchte nicht, dass alle ModelAs für ModelB_1 mit allen ModelAs für ModelB_2 verknüpft werden. Ich möchte buchstäblich alle ModelAs, die BEIDEM ModelB_1 und ModelB_2 zugeordnet sind. Es ist nicht nur auf 2 ModelBs beschränkt, es können bis zu 50 ModelBs sein, daher muss diese skaliert werden.

Ich kann das Problem mit einer Reihe von Analogien beschreiben, die meines Erachtens mein Problem besser beschreiben als der vorherige Absatz:

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

Ich habe über verschiedene Wege nachgedacht, um dies zu erreichen, aber sie sind grob ineffizient und sehr verpönt.

Nehmen wir die obige Analogie, sagen wir die letzte, dann könnten Sie so etwas wie eine Abfrage für alle Personen in jeder Stadt durchführen und dann Elemente in jedem Array finden, die in jedem Array vorhanden sind. Das sind mindestens 5 Abfragen, alle Daten dieser Abfragen werden zurück in die App übertragen, dann muss die App alle 5 Arrays intensiv miteinander vergleichen (Schleifen in Hülle und Fülle!). Das ist böse, oder?

Eine andere mögliche Lösung wäre, die Funde übereinander zu verketten. Dies würde im Wesentlichen das Gleiche wie oben tun, würde jedoch die mehrfachen Abfragen und die Verarbeitung nicht beseitigen. Wie würden Sie die Kette dynamisieren, wenn der Benutzer Kontrollkästchen oder Werte mit bis zu 50 Optionen eingegeben hätte? Scheint schmutzig. Du brauchst eine Schleife. Und das würde wiederum die Suchdauer intensivieren.

Wenn möglich, möchten wir natürlich, dass die Datenbank dies für uns ausführt. Daher haben mir die Leute vorgeschlagen, einfach mehrere Bedingungen einzugeben. Leider können Sie mit HABTM in der Regel nur einen OP durchführen.

Eine andere Lösung, auf die ich gestoßen bin, ist die Verwendung einer Suchmaschine wie Sphinx oder UltraSphinx. Für meine spezielle Situation halte ich das für übertrieben, und ich würde es lieber vermeiden. Ich bin immer noch der Meinung, dass es eine Lösung geben sollte, mit der ein Benutzer eine Abfrage für eine beliebige Anzahl von ModelBs erstellen und alle ModelAs finden kann.

Wie würden Sie dieses Problem lösen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage