web-dev-qa-db-fra.com

Quelle est la difference entre pluck et collect in Rails?

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?

106
Mohit Jain

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 selectet collect

205
apneadiving

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']]
22
Numbers

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

2
Thorin

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

0
Chimed Palden