1

Im Folgenden sind zwei Tabellen mit einigen Beispieldaten: -alle Datensätze erhalten, dass die Tabellen in beiden existieren

Uploads: 
id: 1 , file_ref:abc 
id: 2, file_ref: abc1 
id: 4, file_ref: abc3 
id: 5, file_ref: abc4 
id: 6, file_ref: abc5 
id: 7, file_ref: abc6 

media: 
id: 3, name: 'My Doc' , type: doc 
id: 6, name: 'My Img' , type: img 

Ich habe diese zwei Modelle in Schienen. Nun in meinem Controller möchte ich alle Datensätze in Uploads erhalten, wenn ihre ID in der Medientabelle, d. H. Datensätze aus Upload-Tabelle mit IDs 3 und 6 ist.

+1

Die ID wird geteilt? Der einzige Datensatz, der zurückgegeben werden soll, ist die ID: 6, file_ref: abc5 ', weil die 'id 3' nicht in den Tabellenmedien existiert? – MatayoshiMariano

+0

können Sie den Wert von ** abc5 ** auf ** 5 ** ändern oder müssen Sie zuerst die Nummer auslesen und dann – MZaragoza

+0

finden Alle Medien würden in den Uploads vorhanden sein, aber die Datei_ref ist nur in den Uploads verfügbar was ich will. Also muss ich beide Datensätze mit der ID 6 und 3 aus der Upload-Tabelle holen. – AHK

Antwort

0

Was Sie brauchen, ist INNER JOIN wo Verbindungszustand die IDs der Tabelle sein

Upload.joins("INNER JOIN medias ON media.id = uploads.id") 

Dies wird übersetzt werden:

"SELECT `uploads`.* FROM `uploads` INNER JOIN media ON media.id = uploads.id" 

Edit:

Wie MrYoshiji sagte in diesem comment, Upload.where(id: Media.all) wird auch eine einzige Abfrage durchführen.

So beide Optionen Option kehren alle Upload-Datensätze, die in den Medien Tabellen-IDs vorhanden

0

Haben Sie eine Beziehung zwischen ihnen? Von den Klängen der es haben Sie nicht (Sie sollten wirklich), aber wenn Sie nicht versuchen haben:

ids = Media.all.ids 
Upload.where(id: ids) 

oder als eine Zeile

Upload.where(id: Media.all.ids) 

Damit werden alle Datensätze in Ihrer Upload zurückkehren Tabelle mit einer ID, die in der Medientabelle vorhanden ist.

+0

Mark, der Nachteil dabei ist, dass Sie zwei Abfragen an die Datenbank machen, eine für die 'Media.all.ids' und eine für die' Upload.where'. Mit dem INNER JOIN machst du nur einen. – MatayoshiMariano

+1

'Upload.where (id: Media.all)' wird eine einzige SQL-Abfrage mit einem geschachtelten 'SELECT medias.id [...] FROM medias' machen - aber das ist seltsam anzunehmen, dass nur die Upload-Relation von Media <-> ist definiert durch die Gleichheit ihrer "ID" – MrYoshiji

+0

Wie @MrYoshiji erwähnt, ohne die 'IDs', wird es eine einzige Abfrage – MatayoshiMariano

0

Sie eine Unterabfrage in Ihrem Anruf tun können

Ich denke, dass es so etwas wie dieses

aussehen sollte

Ich hoffe, dass es hilft

Verwandte Themen