J'ai eu la chance d'utiliser pluck et ibs tout en apprenant les rails, je vais donc les résumer.
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.
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.
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.
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.
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.
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
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