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?
quelle
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?
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 Attribute verwenden, zpluck(:id, :name)
.pluck
mehrere Felder, Rails 3 nicht, es sei denn, Sie verwenden dieid
, verwenden Sie.ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/…Ja. Nach Rails Guides ,
pluck
wandelt direkt eine Datenbank Ergebnis in einarray
, ohne die KonstruktionActiveRecord
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:quelle
Der grundlegende und Hauptunterschied besteht darin, dass das Zupfen auf DB-Ebene angewendet wird und das Sammeln alle Daten abruft und dann den Datensatz an Sie zurückgibt, wenn Sie alle Datensätze benötigen, sammeln und wenn nur wenige Felder dann das Zupfen verwenden
quelle
Wenn Sie in einem Fall nur wenige Attribute des abgerufenen Datensatzes verwenden. In solchen Fällen sollten Sie verwenden
pluck
.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ückquelle