Ich hatte die Möglichkeit, beim Lernen von Schienen Zupfen und ibs zu verwenden, also werde ich sie zusammenfassen.
Mit dem Zupfen kann eine Abfrage gesendet werden, um Spalten aus der in einem Modell verwendeten Tabelle abzurufen. Gibt bei Angabe einer Liste von Spaltennamen als Argument ein Array von Werten für die angegebene Spalte mit dem entsprechenden Datentyp zurück.
my_room_ids = current_user.entries.pluck(:room_id)
Wenn Sie mit pry überprüfen, wird es so sein
pry(#<RoomsController>)> my_room_ids
=> [7, 8, 9, 10]
Das Obige ist der Code, der my_room_ids das Array von Werten von: room_id aus dem Modell der mit current_user verknüpften Einträge zuweist. Wenn Sie das zweite Argument festlegen, können Sie es auch ausgeben. Es wird gesagt, dass das Zupfen etwa viermal schneller sein kann als die Karte, wenn nur eine Standarddatenbank durchsucht wird. *wichtiger Punkt Die Zupfmethode löst die Abfrage direkt aus, sodass kein anderer Bereich danach verkettet werden kann.
Wenn kein Argument an die Zupfmethode übergeben wird, werden die Daten aller Spalten in ein Array eingefügt und zurückgegeben. Der Rückgabewert ist ein zweidimensionales Array.
Wenn Sie das Owner-Modell in der Zupfmethode ohne Argumente angeben, werden die Werte der Spalten id, name und age wie unten gezeigt im Array gespeichert.
Wenn Sie kein Argument an die Zupfmethode übergeben
Owner.pluck
SELECT `owners`.* FROM `owners`
=> [
[1, "Tanaka", 23], # id, name,Der Wert der Altersspalte wird gespeichert
[2, "Ito", 44],
[3, "Takahashi", 65],
[4, "Kato", 23]
]
Die Daten aller Spalten werden weiter im Array gespeichert, sodass sie als zweidimensionales Array zurückgegeben werden.
Die Zupfmethode kann in Kombination mit der eindeutigen Methode verwendet werden, mit der Duplikate entfernt werden. Wenn Sie die Altersspalte wie unten gezeigt als Argument für die Zupfmethode angeben, wird der Wert 23 dupliziert und im Array gespeichert.
Der Wert der Altersspalte wird doppelt erhalten
Owner.pluck(:age)
SELECT `owners`.`age` FROM `owners`
=> [23, 44, 65, 23] #Rückgabewert
Sie können einen eindeutigen Wert erhalten, indem Sie doppelte Werte entfernen, indem Sie die unten gezeigte Methode verwenden.
Konsole|Rufen Sie den Wert in der Altersspalte ab, indem Sie Duplikate entfernen
Owner.distinct.pluck(:age)
SELECT DISTINCT `owners`.`age` FROM `owners`
=> [23, 44, 65] #Rückgabewert
Wenn Sie den Rückgabewert überprüfen, können Sie sehen, dass jeder eindeutige Wert im Array gespeichert ist.
Geben Sie die Bedingung an Die Zupfmethode kann zusammen mit der where-Methode verwendet werden, die die Bedingung extrahiert.
Beispiel für die Eingrenzung des Werts der Altersspalte mit der where-Methode
Ruft den Wert der ID-Spalte ab, deren Altersspaltenwert 60 oder weniger beträgt
Owner.where('age <= 60').pluck(:id)
SELECT `owners`.`id` FROM `owners` WHERE (age <= 60)
=> [1, 2, 4] #Rückgabewert
Ruft den Wert der ID-Spalte als Array mit .pluck (: id) aus den extrahierten Daten ab.
Die Zupfmethode kann auch die Spaltenwerte der zugehörigen Tabellen mithilfe der Joins-Methode abrufen, die die zugehörigen Tabellen intern verknüpft.
Nehmen wir als Beispiel die Besitzertabelle, die den Besitzer verwaltet, und die Katzentabelle, die die Katze verwaltet.
Beispiele für Besitzer und Katzentische
Wenn Sie den Katzentyp des Besitzers in dieser Tabelle als Array abrufen möchten, können Sie die Tabelle wie unten gezeigt intern mit der Join-Methode verknüpfen und mit der Zupfmethode den Wert der Speziesspalte der Katzentabelle des Join-Ziels abrufen. können.
Ein Beispiel für die innere Verbindung zwischen Besitzertisch und Katzentisch
Rufen Sie den Wert der Speziesspalte der Katzentabelle ab, der Sie beitreten möchten
Owner.joins(:cats).pluck(:species)
SELECT `species` FROM `owners` INNER JOIN `cats` ON `cats`.`owner_id` = `owners`.`id`
=> ["mischen", "Schottische Falte", "Amerikanisches kurzes Haar", "mischen"] #Rückgabewert
In Owner.joins (: Katzen) werden nur die Daten verknüpft, die dem Wert im rosa Teil entsprechen (Eigentümer.id = Katzen.owner_id-Verknüpfungsbedingung). Verwenden Sie dann aus den kombinierten Daten .pluck (: species), um den Wert der Speziesspalte der Katzentabelle abzurufen, die als Array kombiniert werden soll.
Da die erfassten Werte doppelte Mischungen aufweisen, können Sie die doppelten mit der unten gezeigten Methode entfernen.
Holen Sie sich den eindeutigen Wert der Speziesspalte der Katzentabelle, der Sie beitreten möchten
Owner.joins(:cats).distinct.pluck(:species)
SELECT DISTINCT `species` FROM `owners` INNER JOIN `cats` ON `cats`.`owner_id` = `owners`.`id`
=> ["mischen", "Schottische Falte", "Amerikanisches kurzes Haar"] #Rückgabewert
Sie können den Rückgabewert überprüfen, bei dem jeder eindeutige Wert im Array gespeichert und zurückgegeben wird.
Die Methodenkette kann für das ActiveRecord :: Relation-Objekt verwendet werden, daher kann sie nicht für die Zupfmethode verwendet werden, bei der das Array der Rückgabewert ist.
Bei Verwendung einer Methodenkette Wenn Sie nach der Zupfmethode eine Methodenkette verwenden, erhalten Sie einen NoMethodError (siehe unten).
Bei Verwendung einer Methodenkette nach der Zupfmethode
Owner.pluck(:id).where('age <= 60')
NoMethodError (undefined method `where' for [1, 2, 3, 4]:Array)
Oben wurde versucht, die where-Methode mithilfe der Methodenkette aufzurufen. (.) Nach der Zupfmethode. Da der Rückgabewert der Zupfmethode jedoch ein Array (Array) ist, wird der Fehler angezeigt, dass in der Klasse array (Array) keine where-Methode vorhanden ist. Es tritt auf.
Wenn Sie die Abfragemethode zusammen verwenden Sie können nach der Zupfmethode keine anderen Abfragemethoden in der Methodenkette aufrufen. Wenn Sie also die Abfragemethode zusammen verwenden möchten, setzen Sie die Zupfmethode wie unten gezeigt am Ende.
Owner.where('age <= 60').pluck(:id)
SELECT `owners`.`id` FROM `owners` WHERE (age <= 60)
=> [1, 2, 4]
Seien Sie bei der Verwendung mit anderen Abfragemethoden nur in der Reihenfolge vorsichtig, in der die Zupfmethode verwendet wird. Darüber hinaus gibt es eine Auswahlmethode, mit der die Daten einer bestimmten Spalte abgerufen werden, sofern sie nicht als Array zurückgegeben werden müssen. Der Rückgabewert dieser select-Methode ist ein ActiveRecord :: Relation-Objekt, sodass Sie eine Methodenkette verwenden können.
Ergänzende Erklärung Die Abfragemethode ist eine Methode, die beim Durchsuchen der Datenbank verschiedene Bedingungen erstellt, z. B. die where-Methode und die order-Methode. Es gibt das Ergebnis der Bedingung als ActiveRecord :: Relation-Objekt zurück.
Beide sind insofern gleich, als sie Daten für eine bestimmte Spalte abrufen, es gibt jedoch einige Unterschiede.
Zupfmethode und Kartenmethode
Modellname.pluck(:Spaltenname)
Modellname.all.map(&:Spaltenname) #Das gleiche wie oben
Unterschiede in ausgegebenen SQL-Anweisungen Bei der Zupfmethode und der Kartenmethode werden unterschiedliche SQL-Anweisungen ausgegeben, wenn die Methode ausgeführt wird. Wenn Sie beispielsweise mit jeder Methode die Daten der Altersspalte der Besitzertabelle abrufen, sieht dies wie folgt aus.
Erhalten Sie Altersspaltendaten mit Zupf- und Kartenmethoden
Owner.pluck(:age) #Wenn Sie mit der Zupfmethode kommen
SELECT `owners`.`age` FROM `owners`
=> [23, 44, 65, 23]
Owner.all.map(&:age) #Wenn Sie mit der Kartenmethode kommen
SELECT `owners`.* FROM `owners`
=> [23, 44, 65, 23]
Wenn ich den Rückgabewert überprüfe, geben beide Methoden ein Array zurück, aber die ausgegebenen SQL-Anweisungen sind unterschiedlich.
Bei Ausführung mit der Zupfmethode wird die folgende SQL ausgegeben.
SQL |Wenn die Zupfmethode ausgeführt wird
SELECT `owners`.`age` FROM `owners`
Da die Altersspalte der Besitzertabelle in der SELECT-Anweisung wie SELECT owner.age angegeben ist, können Sie sehen, dass die "Daten der Altersspalte der Besitzertabelle" in dieser SQL-Anweisung erfasst werden.
Wenn andererseits die Map-Methode ausgeführt wird, wird die folgende SQL ausgegeben.
SQL |Wenn die Map-Methode ausgeführt wird
SELECT `owners`.* FROM `owners`
Da alle Spalten der Eigentümertabelle in der SELECT-Anweisung wie SELECT-Eigentümer angegeben sind. *, Können Sie sehen, dass in dieser SQL-Anweisung "Daten aller Spalten der Eigentümertabelle" erfasst werden.
Daraus ist ersichtlich, dass Owner.all.map (&: age) einmal alle Daten aus der Eigentümertabelle abruft und dann nur die Daten in der Altersspalte erneut in das Array einfügt. Wie Sie sehen können, sind die Rückgabewerte der Zupfmethode und der Kartenmethode identisch, die ausgegebenen SQL-Anweisungen sind jedoch unterschiedlich.
SQL-Unterschied zwischen Zupfmethode und Kartenmethode Die Zupfmethode schränkt die Spaltendaten ein, die von der SQL-Stufe erfasst werden sollen. Die Kartenmethode ruft die Daten einer bestimmten Spalte aus den Daten ab, nachdem alle Daten abgerufen wurden. Szenen, die Zupfen anstelle von Karte verwenden Verwenden Sie die Zupfmethode, wenn Sie nur Daten in einer bestimmten Spalte verwenden möchten. Der Grund dafür ist, dass Sie nur bestimmte Daten benötigen, die Kartenmethode jedoch alle Daten liest, wodurch Speicherplatz verschwendet und die Leistung beeinträchtigt wird.
Szenen, in denen Karte statt Zupfen verwendet wird Wenn Sie Daten von einem instanziierten Objekt abrufen möchten, verwenden Sie die Kartenmethode. Der Grund dafür ist, dass die Zupfmethode selbst für ein instanziiertes Objekt jedes Mal SQL ausführt, was zu einer schlechten Leistung führt.
Eine Methode, die den Wert der im Argument angegebenen Spalte als Array zurückgibt Wenn mehrere Argumente angegeben werden, wird ein zweidimensionales Array zurückgegeben. Sie können keine Methodenkette nach der Zupfmethode verwenden
Abrufen von Spaltendaten für den Primärschlüssel Die Zupfmethode kann bestimmte Spaltendaten als Array abrufen. Wenn Sie jedoch die Primärschlüssel-Spaltendaten als Array abrufen möchten, können Sie die ids-Methode verwenden.
Rufen Sie die Daten des Primärschlüssels der folgenden Eigentümertabelle mit der Methode ids ab.
Daten in der ID-Spalte der Besitzertabelle abrufen
Owner.ids
SELECT `owners`.`id` FROM `owners`
=> [1, 2, 3, 4] #Rückgabewert
Bei der Überprüfung des Rückgabewerts werden die Spaltendaten des Primärschlüssels als Array erfasst.
Recommended Posts