Hier sind zwei Beispielcodes.
Erster mit collect
:
User.first.gifts.collect(&:id)
Zweiter mit pluck
:
User.first.gifts.pluck(:id)
Gibt es einen Unterschied zwischen ihnen in der Leistung oder etwas anderem?
Hier sind zwei Beispielcodes.
Erster mit collect
:
User.first.gifts.collect(&:id)
Zweiter mit pluck
:
User.first.gifts.pluck(:id)
Gibt es einen Unterschied zwischen ihnen in der Leistung oder etwas anderem?
Antworten:
pluck
ist auf der DB-Ebene. Es wird nur das bestimmte Feld abgefragt. Sehen Sie das .
Wenn Sie das tun:
User.first.gifts.collect(&:id)
Sie haben Objekte mit allen Feldern geladen und erhalten id
dank der auf Enumerable basierenden Methode einfach den Dank.
So:
Wenn Sie nur die id
mit Rails 4 benötigen , verwenden Sie ids
:User.first.gifts.ids
Wenn Sie nur einige Felder mit Rails 4 benötigen, verwenden Sie pluck
:User.first.gifts.pluck(:id, :name, ...)
Wenn Sie nur ein Feld mit Rails 3 benötigen, verwenden Sie pluck
:User.first.gifts.pluck(:id)
Wenn Sie alle Felder benötigen , verwenden Siecollect
Wenn Sie einige Felder mit Rails 4 benötigen, verwenden Sie diese weiterhin pluck
Wenn Sie einige Felder mit Rails 3 benötigen, verwenden Sie select
undcollect
pluck
mehrere Felder, Rails 3 nicht, es sei denn, Sie verwenden die
id
, verwenden Sie .ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/…
Ja. Nach Rails Guides , pluck
wandelt direkt eine Datenbank Ergebnis in ein array
, ohne die Konstruktion ActiveRecord
Objekte. Dies bedeutet eine bessere Leistung für eine große oder häufig ausgeführte Abfrage.
Zusätzlich zur Antwort von @ apneadiving pluck
können sowohl einzelne als auch mehrere Spaltennamen als Argument verwendet werden:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Wenn Sie in einem Fall nur wenige Attribute des abgerufenen Datensatzes verwenden. In solchen Fällen sollten Sie verwenden pluck
.
User.collect(&:email)
Im obigen Beispiel, wenn Sie nur ein E-Mail-Attribut benötigen, verschwenden Sie Speicher und Zeit. Da alle Spalten aus der Benutzertabelle in der Datenbank abgerufen werden, wird der Speicher für alle Attribute zugewiesen (einschließlich der Attribute, die Sie niemals verwenden werden).
HINWEIS: Gibt pluck
ActiveRecord_Relation des Benutzers nicht zurück
pluck
mehrere Attribute verwenden, zpluck(:id, :name)
.