Voici deux exemples de codes.
Premier avec collect
:
User.first.gifts.collect(&:id)
Deuxième avec pluck
:
User.first.gifts.pluck(:id)
Y a-t-il une différence entre les performances ou autre chose?
Voici deux exemples de codes.
Premier avec collect
:
User.first.gifts.collect(&:id)
Deuxième avec pluck
:
User.first.gifts.pluck(:id)
Y a-t-il une différence entre les performances ou autre chose?
Réponses:
pluck
est au niveau db. Il interrogera uniquement le champ particulier. Regarde ça .
Quand vous faites:
User.first.gifts.collect(&:id)
Vous avez des objets avec tous les champs chargés et vous obtenez simplement les id
remerciements à la méthode basée sur Enumerable.
Alors:
si vous n'avez besoin que du id
avec Rails 4, utilisez ids
:User.first.gifts.ids
si vous n'avez besoin que de certains champs avec Rails 4, utilisez pluck
:User.first.gifts.pluck(:id, :name, ...)
si vous n'avez besoin que d'un seul champ avec Rails 3, utilisez pluck
:User.first.gifts.pluck(:id)
si vous avez besoin de tous les champs, utilisezcollect
si vous avez besoin de certains champs avec Rails 4, utilisez toujours pluck
si vous avez besoin de certains champs avec Rails 3, utilisez select
etcollect
pluck
en charge plusieurs champs, Rails 3 ne le fait pas, sauf si vous utilisez la solution de contournement de Ryan Lefevre
id
, utilisez .ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/...
Oui. Selon les guides Rails , pluck
convertit directement un résultat de base de données en un array
, sans construire d' ActiveRecord
objets. Cela signifie de meilleures performances pour une requête volumineuse ou souvent exécutée.
En plus de la réponse de @ apneadiving, pluck
peut prendre à la fois des noms de colonnes simples et multiples comme argument:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
La différence fondamentale et principale est que Pluck s'applique au niveau de la base de données et collecte toutes les données, puis vous renvoie l'enregistrement lorsque vous avez besoin de tous les enregistrements, utilisez collect et lorsque peu de champs utilisent ensuite pluck
S'il y a un cas où vous utilisez peu d'attributs de l'enregistrement récupéré. Dans de tels cas, vous devez utiliser pluck
.
User.collect(&:email)
Dans l'exemple ci-dessus, si vous n'avez besoin que d'un attribut de courrier électronique, vous perdez de la mémoire et du temps. Parce qu'il récupérera toutes les colonnes de la table utilisateur dans la base de données, alloue la mémoire pour chaque attribut (y compris les attributs que vous n'utiliserez jamais)
REMARQUE: pluck
ne renvoie pas ActiveRecord_Relation de l'utilisateur
pluck
avec plusieurs attributs, commepluck(:id, :name)
?