[RUBY] À propos de la méthode Pluck et de la méthode ID

Contenu

J'ai eu la chance d'utiliser pluck et ibs tout en apprenant les rails, je vais donc les résumer.

Qu'est-ce que pluck?

pluck peut être utilisé pour envoyer une requête pour récupérer des colonnes de la table utilisée dans un modèle. Étant donné une liste de noms de colonnes comme argument, renvoie un tableau de valeurs pour la colonne spécifiée avec le type de données correspondant.

my_room_ids = current_user.entries.pluck(:room_id)

Si vous vérifiez avec pry, ce sera comme ça
pry(#<RoomsController>)> my_room_ids
=> [7, 8, 9, 10]

Ce qui précède est le code qui attribue le tableau de valeurs de: room_id à my_room_ids à partir du modèle d'entrées associé à current_user. Si vous définissez le deuxième argument, vous pouvez également le générer. On dit que le pluck peut être environ quatre fois plus rapide que la carte s'il ne recherche que dans une base de données standard. *point important La méthode pluck déclenche directement la requête, de sorte qu'aucune autre portée ne peut être enchaînée après elle.

Sans arguments

Si aucun argument n'est passé à la méthode pluck, les données de toutes les colonnes sont placées dans un tableau et renvoyées. La valeur de retour est un tableau à deux dimensions.

Si vous spécifiez le modèle Owner dans la méthode pluck sans argument, les valeurs des colonnes id, name et age sont stockées dans le tableau comme indiqué ci-dessous.

Si vous ne passez pas d'argument à la méthode pluck
Owner.pluck
SELECT `owners`.* FROM `owners`


=> [
[1, "Tanaka", 23],  # id, name,La valeur de la colonne d'âge est stockée
[2, "Ito", 44], 
[3, "Takahashi", 65], 
[4, "Kato", 23]
]

Les données de toutes les colonnes sont ensuite stockées dans le tableau, elles sont donc renvoyées sous la forme d'un tableau à deux dimensions.

Supprimer la duplication

La méthode de pincement peut être utilisée en combinaison avec la méthode distincte qui supprime les doublons. Si vous spécifiez la colonne age comme argument de la méthode pluck comme indiqué ci-dessous, la valeur de 23 sera dupliquée et stockée dans le tableau.

La valeur de la colonne âge est obtenue en double
Owner.pluck(:age)
SELECT `owners`.`age` FROM `owners`

=> [23, 44, 65, 23] #Valeur de retour
Vous pouvez obtenir une valeur unique en supprimant les valeurs en double à l'aide de la méthode distincte comme indiqué ci-dessous.

console|Obtenez la valeur dans la colonne d'âge en supprimant les doublons
Owner.distinct.pluck(:age)
SELECT DISTINCT `owners`.`age` FROM `owners`

=> [23, 44, 65] #Valeur de retour

Si vous vérifiez la valeur de retour, vous pouvez voir que chaque valeur unique est stockée dans le tableau.

Précisez la condition La méthode pluck peut être utilisée avec la méthode where qui extrait la condition.

Exemple de réduction de la valeur de la colonne age avec la méthode where

Obtenez la valeur de la colonne id dont la valeur de la colonne d'âge est inférieure ou égale à 60

Owner.where('age <= 60').pluck(:id)
SELECT `owners`.`id` FROM `owners` WHERE (age <= 60)

=> [1, 2, 4] #Valeur de retour

Récupérez la valeur de la colonne id sous forme de tableau avec .pluck (: id) à partir des données extraites.

Obtenir les valeurs de colonne pour les tables associées

La méthode pluck peut également obtenir les valeurs de colonne des tables associées à l'aide de la méthode de jointure qui joint les tables associées en interne.

Prenons la table des propriétaires qui gère le propriétaire et la table des chats qui gère le chat comme exemple.

Exemples de tables de propriétaires et de chats

Lorsque vous souhaitez obtenir le type de chat appartenant au propriétaire dans cette table sous forme de tableau, vous pouvez joindre la table en interne avec la méthode de jointure comme indiqué ci-dessous et obtenir la valeur de la colonne species de la table cats de la destination de jointure avec la méthode pluck. pouvez.

Un exemple de jonction intérieure entre la table des propriétaires et la table des chats

Obtenez la valeur de la colonne des espèces de la table des chats à rejoindre
Owner.joins(:cats).pluck(:species)
SELECT `species` FROM `owners` INNER JOIN `cats` ON `cats`.`owner_id` = `owners`.`id`

=> ["mélanger", "Scottish fold", "Cheveux courts américains", "mélanger"] #Valeur de retour

Dans Owner.joins (: cats), seules les données qui correspondent à la valeur de la partie rose (condition de jointure de owner.id = cats.owner_id) sont jointes. Ensuite, à partir des données combinées, utilisez .pluck (: species) pour obtenir la valeur de la colonne species de la table cats à combiner sous forme de tableau.

Étant donné que les valeurs acquises ont des mélanges en double, vous pouvez supprimer les doublons avec la méthode distincte comme indiqué ci-dessous.

Obtenez la valeur unique de la colonne espèces de la table chats à rejoindre

Owner.joins(:cats).distinct.pluck(:species)
SELECT DISTINCT `species` FROM `owners` INNER JOIN `cats` ON `cats`.`owner_id` = `owners`.`id`

=> ["mélanger", "Scottish fold", "Cheveux courts américains"] #Valeur de retour

Vous pouvez vérifier la valeur de retour que chaque valeur unique est stockée dans le tableau et renvoyée.

La chaîne de méthodes peut être utilisée pour l'objet ActiveRecord :: Relation, elle ne peut donc pas être utilisée pour la méthode pluck où le tableau est la valeur de retour.

Lors de l'utilisation d'une chaîne de méthodes Si vous utilisez une chaîne de méthodes après la méthode pluck, vous obtiendrez une NoMethodError comme indiqué ci-dessous.

Lors de l'utilisation d'une chaîne de méthodes après la méthode de pincement
Owner.pluck(:id).where('age <= 60')
NoMethodError (undefined method `where' for [1, 2, 3, 4]:Array)

Dans ce qui précède, j'ai essayé d'appeler la méthode where en utilisant la méthode chain (.) Après la méthode pluck, mais comme la valeur de retour de la méthode pluck est un tableau (Array), j'obtiens une erreur indiquant qu'il n'y a pas de méthode where dans la classe array (Array). Cela se produit.

Lors de l'utilisation conjointe de la méthode de requête Vous ne pouvez pas appeler d'autres méthodes de requête dans la chaîne de méthodes après la méthode pluck, donc si vous souhaitez utiliser la méthode de requête ensemble, placez la méthode pluck à la fin comme indiqué ci-dessous.

Owner.where('age <= 60').pluck(:id)
SELECT `owners`.`id` FROM `owners` WHERE (age <= 60)

=> [1, 2, 4]

Lors de l'utilisation avec d'autres méthodes de requête, faites attention uniquement à l'ordre dans lequel la méthode pluck est utilisée. En outre, il existe une méthode de sélection qui récupère les données d'une colonne spécifique à moins qu'il ne soit nécessaire de la renvoyer sous forme de tableau. La valeur de retour de cette méthode de sélection est un objet ActiveRecord :: Relation, vous pouvez donc utiliser une chaîne de méthodes.

Explication supplémentaire La méthode de requête est une méthode qui crée diverses conditions lors de la recherche dans la base de données, telles que la méthode where et la méthode order. Il renvoie le résultat de la condition sous la forme d'un objet ActiveRecord :: Relation.

Différence entre la méthode pluck et la méthode cartographique

Les deux sont identiques en ce sens qu'ils récupèrent des données pour une colonne particulière, mais il existe quelques différences.

méthode de pincement et méthode de carte
Nom du modèle.pluck(:Nom de colonne)

Nom du modèle.all.map(&:Nom de colonne) #Comme ci-dessus

Différences dans les instructions SQL émises La méthode pluck et la méthode map ont des instructions SQL différentes émises lorsque la méthode est exécutée. Par exemple, si vous obtenez les données de la colonne age de la table des propriétaires avec chaque méthode, ce sera comme suit.

Obtenez des données de colonne d'âge avec les méthodes de pluck et de carte
Owner.pluck(:age) #Lors de l'utilisation de la méthode pluck
SELECT `owners`.`age` FROM `owners`
=> [23, 44, 65, 23]

Owner.all.map(&:age) #Lors de l'utilisation de la méthode de la carte
SELECT `owners`.* FROM `owners`
=> [23, 44, 65, 23]

Lorsque je vérifie la valeur de retour, les deux méthodes renvoient un tableau, mais les instructions SQL émises sont différentes.

Lorsqu'il est exécuté par la méthode pluck, le SQL suivant sera émis.

SQL |Lorsque la méthode pluck est exécutée
SELECT `owners`.`age` FROM `owners`

Puisque la colonne age de la table des propriétaires est spécifiée dans l'instruction SELECT comme SELECT owner.age, vous pouvez voir que les «données de la colonne age de la table des propriétaires» sont acquises dans cette instruction SQL.

D'autre part, lorsque la méthode map est exécutée, le SQL suivant sera émis.

SQL |Lorsque la méthode map est exécutée
SELECT `owners`.* FROM `owners`

Puisque toutes les colonnes de la table des propriétaires sont spécifiées dans l'instruction SELECT comme les propriétaires SELECT. *, Vous pouvez voir que "les données de toutes les colonnes de la table des propriétaires" sont acquises dans cette instruction SQL.

À partir de là, on peut voir que Owner.all.map (&: age) récupère une fois toutes les données de la table des propriétaires, puis réinsère uniquement les données de la colonne age dans le tableau. Comme vous pouvez le voir, les valeurs de retour de la méthode pluck et de la méthode map sont les mêmes, mais les instructions SQL émises sont différentes.

Différence SQL entre la méthode pluck et la méthode map La méthode pluck réduit les données de colonne à acquérir à partir de l'étape SQL. La méthode map obtient les données d'une colonne spécifique à partir des données après avoir obtenu toutes les données. Scènes qui utilisent pluck au lieu de map Utilisez la méthode pluck lorsque vous souhaitez uniquement utiliser des données dans une colonne spécifique. La raison en est que vous n'avez besoin que de données spécifiques, mais la méthode de carte lit toutes les données, gaspillant de la mémoire et ralentissant les performances.

Scènes qui utilisent la carte au lieu de plumer Si vous souhaitez obtenir des données à partir d'un objet instancié, utilisez la méthode map. La raison en est que la méthode pluck exécute SQL à chaque fois, même pour un objet instancié, ce qui entraîne de mauvaises performances.

Résumé du pluck

Une méthode qui renvoie la valeur de la colonne spécifiée dans l'argument sous forme de tableau Si plusieurs arguments sont spécifiés, un tableau à deux dimensions sera renvoyé. Vous ne pouvez pas utiliser une chaîne de méthodes après la méthode pluck

Que sont les identifiants?

Obtenir les données de colonne pour la clé primaire La méthode pluck peut obtenir des données de colonne spécifiques sous forme de tableau, mais si vous souhaitez obtenir les données de colonne de clé primaire sous forme de tableau, il est pratique d'utiliser la méthode ids.

Obtenez les données de la clé primaire du tableau des propriétaires ci-dessous avec la méthode ids.

Obtenir les données dans la colonne ID de la table des propriétaires
Owner.ids
SELECT `owners`.`id` FROM `owners`
=> [1, 2, 3, 4] #Valeur de retour

Lors de la vérification de la valeur de retour, les données de la colonne de la clé primaire sont acquises sous forme de tableau.

Recommended Posts

À propos de la méthode Pluck et de la méthode ID
À propos des méthodes Java statiques et non statiques
À propos des méthodes equals () et hashcode ()
À propos des méthodes singulières
À propos de la méthode de HttpServlet ()
Fonctions et méthodes
À propos des méthodes Ruby
À propos de Bean et DI
À propos des classes et des instances
À propos de gets et gets.chomp
À propos des méthodes d'instance Ruby
À propos de l'appel des méthodes d'instance
À propos de la redirection et du transfert
À propos de l'encapsulation et de l'héritage
À propos de Serializable et serialVersionUID
À propos de la relation entre les méthodes HTTP, les actions et CRUD
À propos de l'instruction et de l'instruction if
Méthode de codage et principe de refactoring
À propos des méthodes de validation dans JUnit
[Java] Classe générique et méthode générique
chemins de rails et méthodes d'URL
A propos de l'attribution d'un nom aux méthodes de modèle Rails
À propos des hachages et symboles Ruby
[Java] À propos de String et StringBuilder
À peu près la même et la même valeur
Prise en compte des classes et des instances
Méthodes Java et surcharges de méthodes
Méthode de classe variable de classe Java
Pensez aux différences entre les fonctions et les méthodes (en Java)
À propos du package Java et de l'importation
À propos de Ruby, modèle objet
[Ruby] Méthodes singulières et classes singulières
À propos des classes et des instances Ruby
Méthodes et classes Ruby (basiques)
À propos des variables d'instance et attr_ *
Méthodes et classes abstraites Java
À propos des méthodes fréquemment utilisées dans la conception
En savoir plus sur les gemmes et les bundlers
Entrée standard Ruby et diverses méthodes
[Java débutant] À propos de l'abstraction et de l'interface
À propos des guillemets simples et doubles Ruby
À propos de la phase de paramétrage et de la phase d'exécution de Gradle
Comment appeler des classes et des méthodes
À propos de l'opérateur de produit Ruby (&) et de l'opérateur somme (|)
[Pour nos nouveaux arrivants] À propos des méthodes isXXX
Etudier Java 8 (méthode StaticIF et Default)
À propos de removeAll et de retentionAll de ArrayList
Java Generics (définit les classes et les méthodes)
Traitement des relevés et des succursales
À propos de l'héritage orienté objet et du rendement Ruby
Application des méthodes downcase et slice
A propos des types primitifs et des types de référence Java
Considération sur les rails et l'architecture propre
Ceci et cela à propos de Base64 (Java)