[RUBY] Über die Zupfmethode und die ID-Methode

Inhalt

Ich hatte die Möglichkeit, beim Lernen von Schienen Zupfen und ibs zu verwenden, also werde ich sie zusammenfassen.

Was ist Zupfen?

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.

Ohne Argumente

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.

Entfernen Sie Duplikate

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.

Spaltenwerte für verwandte Tabellen abrufen

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.

Unterschied zwischen Zupfmethode und Kartenmethode

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.

Zusammenfassung des Zupfens

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

Was sind Ausweise?

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

Über die Zupfmethode und die ID-Methode
Informationen zu statischen und nicht statischen Java-Methoden
Informationen zu den Methoden equals () und hashcode ()
Über singuläre Methoden
Über die Methode von HttpServlet ()
Funktionen und Methoden
Über Ruby-Methoden
Über Bean und DI
Über Klassen und Instanzen
Über bekommt und bekommt.chomp
Informationen zu Ruby-Instanzmethoden
Informationen zum Aufrufen von Instanzmethoden
Über Weiterleiten und Weiterleiten
Über Kapselung und Vererbung
Informationen zu Serializable und serialVersionUID
Informationen zur Beziehung zwischen HTTP-Methoden, Aktionen und CRUD
Über für Anweisung und wenn Anweisung
Codierungsmethode und Refactoring-Prinzip
Informationen zu Validierungsmethoden in JUnit
[Java] Generics-Klasse und Generics-Methode
Schienenpfad und URL-Methoden
Informationen zum Benennen von Rails-Modellmethoden
Über Ruby-Hashes und -Symbole
[Java] Über String und StringBuilder
Ungefähr der gleiche und der gleiche Wert
Überlegungen zu Klassen und Instanzen
Java-Methoden und Methodenüberladungen
Java-Klasse Variable Klassenmethode
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
Über Java-Paket und Import
Über Ruby und Objektmodell
[Ruby] Singuläre Methoden und singuläre Klassen
Informationen zu Ruby-Klassen und -Instanzen
Ruby-Methoden und -Klassen (grundlegend)
Über Instanzvariablen und attr_ *
Java abstrakte Methoden und Klassen
Über häufig verwendete Methoden in der Entwicklung
Erfahren Sie mehr über Edelsteine und Bündler
Ruby-Standardeingabe und verschiedene Methoden
[Java-Anfänger] Über Abstraktion und Schnittstelle
Über Ruby einfache Anführungszeichen und doppelte Anführungszeichen
Informationen zur Einstellungsphase und Ausführungsphase von Gradle
Aufrufen von Klassen und Methoden
Informationen zum Ruby-Produktoperator (&) und zum Summenoperator (|)
[Für unsere Neulinge] Über isXXX-Methoden
Java 8 studieren (StaticIF und Standardmethode)
Informationen zu removeAll und RetainAll von ArrayList
Java Generics (definiert Klassen und Methoden)
If-Anweisung und Verzweigungsverarbeitung
Über objektorientierte Vererbung und über Ertrag Ruby
Anwendung von Downcase- und Slice-Methoden
Informationen zu primitiven Java-Typen und Referenztypen
Überlegungen zu Schienen und sauberer Architektur
Dies und das über Base64 (Java)