Kreuzung von zwei Beziehungen
Sagen, ich habe zwei Beziehungen, die halten-Datensätze in das gleiche Modell, wie:
@companies1 = Company.where(...)
@companies2 = Company.where(...)
Wie finde ich den Schnittpunkt dieser beiden Relationen, D. H. nur diejenigen Unternehmen, die existieren innerhalb der beiden?
- Scheint, dass Sie nicht möchten, dass sql hier. So konnte man mithilfe der array-Kreuzung-Methode: ruby-doc.org/core/classes/Array.html#M000274
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig Verbindung dieser
where
zusammen schafft UND das ist, was Sie wollen.So viele werden:
====== AKTUALISIERT ======
Gibt es zwei Fälle:
So, wenn Sie in Fall 2, werden Sie brauchen, um zu tun, wie das, was @apneadiving kommentiert.
Natürlich, dies zu tun, schickt zwei Abfragen und höchstwahrscheinlich abgefragt, mehr Ergebnisse, als Sie benötigt.
where
. Ist es eine manuelle Möglichkeit zur Berechnung dieser Kreuzung?Verwenden sql-Schlüsselwort INTERSECT.
wird es schneller sein, als die Vorherige Lösung.
params1
undparams2
sind sowohl arrays von indetermine Länge?#{Array.new(params1.size, '?').join(',')}
schneller ist. Aber es ist nicht so wichtig in diesem Fall.Ich lösen ähnliches problem auf diese Weise
Müssen wir
unprepared_statement
block hier, weil die Letzte Rails-Versionen verwenden vorbereitete Anweisungen zur Beschleunigung arel Abfragen, aber wir brauchen auch eine Reine SQL vorhanden.Könnten Sie
ActiveRecord::SpawnMethods#merge
Beispiel:
Für alle, die fest mit Rails4 und verwenden kann Rails5 .syntax:
Hatte ich eine dynamisch die Anzahl der großen Anfragen, die hatten ähnliche Bedingungen ( und daher auch ähnliche Ergebnisse). Mein rake server Probleme hätte, wenn Sie alle auf einmal bekommen würden instanziiert, Umgerechnet auf arrays und dann zusammengeführt.
Brauchte ich ein ActiveRecord::Relation (noch nicht ausgelöst) zu verwenden mit find_each.
Sah so etwas wie dieses:
Seiner Art hacky-aber es funktioniert, bis Sie hoffentlich die Migration auf Schienen 5