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 leur performance ou autre chose?
pluck
est au niveau de la base de données. Il interrogera uniquement le champ particulier. Regarde ça .
Quand tu fais:
User.first.gifts.collect(&:id)
Vous avez des objets avec tous les champs chargés et vous obtenez simplement la id
grâce à la méthode basée sur Enumerable.
Alors:
si vous seulement avez besoin de id
avec Rails 4, utilisez ids
: User.first.gifts.ids
si vous seulement avez besoin de certains champs avec Rails 4, utilisez pluck
: User.first.gifts.pluck(:id, :name, ...)
si vous seulement avez besoin d'un champ avec Rails 3, utilisez pluck
: User.first.gifts.pluck(:id)
si vous avez besoin de tous les champs, utilisez collect
si vous avez besoin de champs avec Rails 4, utilisez toujours pluck
si vous avez besoin de certains champs avec Rails 3, utilisez select
et collect
Oui. Selon les guides Rails , pluck
convertit directement le résultat d'une base de données en un array
, sans construire d'objets ActiveRecord
. Cela signifie de meilleures performances pour une requête volumineuse ou souvent en cours d'exécution.
En plus de la réponse de @ apneadiving, pluck
peut prendre en argument les noms de colonnes simples et multiples:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
La différence principale et fondamentale réside dans le fait que Pluck s'applique au niveau de la base de données et que la collecte récupère toutes les données, puis vous renvoie l'enregistrement
S'il existe un cas où vous utilisez peu d'attributs de l'enregistrement récupéré. Dans ce cas, vous devriez utiliser pluck
.
User.collect(&:email)
Dans l'exemple ci-dessus, si vous n'avez besoin que d'un attribut email, vous perdez de la mémoire et du temps. Puisqu'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