it-swarm.com.de

Was ist der Unterschied zwischen Zupfen und Sammeln in Rails?

Hier sind zwei Beispielcodes.

Erste mit collect:

User.first.gifts.collect(&:id)

Zweite mit pluck:

User.first.gifts.pluck(:id)

Gibt es einen Unterschied zwischen ihnen oder etwas anderem?

106
Mohit Jain

pluck befindet sich auf Datenbankebene. Es wird nur das bestimmte Feld abgefragt. Sieh dir das an .

Wenn Sie das tun:

 User.first.gifts.collect(&:id)

Sie haben Objekte mit allen Feldern geladen und Sie erhalten die Variable id dank der auf Enumerable basierenden Methode.

So:

  • wenn Sie only die id mit Rails 4 benötigen, verwenden Sie ids: User.first.gifts.ids

  • wenn Sie only einige Felder mit Rails 4 benötigen, verwenden Sie pluck: User.first.gifts.pluck(:id, :name, ...)

  • wenn Sie only ein Feld mit Rails 3 benötigen, verwenden Sie pluck: User.first.gifts.pluck(:id)

  • wenn Sie alle -Felder benötigen, verwenden Sie collect.

  • wenn Sie einige Felder mit Rails 4 benötigen, verwenden Sie noch pluck.

  • wenn Sie einige Felder mit Rails 3 benötigen, verwenden Sie selectund collect

205
apneadiving

Ja. Laut Rails-Guides konvertiert pluck ein Datenbankergebnis direkt in eine array, ohne ActiveRecord-Objekte zu erstellen. Dies bedeutet eine bessere Leistung für eine große oder häufig laufende Abfrage.

Zusätzlich zur Antwort von @ apneadiving kann pluck sowohl einzelne als auch mehrere Spaltennamen als Argument verwenden:

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
22
Numbers

Der Haupt- und Hauptunterschied besteht darin, dass Pluck auf Datenbankebene angewendet wird. Sammeln Sie alle Daten ab und geben Sie den Datensatz an Sie zurück

2
Thorin

Wenn es einen Fall gibt, in dem Sie wenige Attribute des abgerufenen Datensatzes verwenden. In solchen Fällen sollten Sie pluck verwenden.

User.collect(&:email)

In obigem Beispiel, wenn Sie nur ein E-Mail-Attribut benötigen, um Speicher und Zeit zu verschwenden. Da alle Spalten aus der Benutzertabelle in der Datenbank abgerufen werden, wird der Speicher für die einzelnen Attribute (einschließlich der Attribute, die Sie niemals verwenden werden) zugewiesen. 

HINWEIS: pluck gibt ActiveRecord_Relation des Benutzers nicht zurück

0
Chimed Palden