J'ai déjà une solution qui fonctionne, mais j'aimerais vraiment savoir pourquoi cela ne fonctionne pas:
ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }
Il sélectionne, mais n'imprime pas de valeurs uniques, il imprime toutes les valeurs, y compris les doublons. Et c'est dans la documentation: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
ruby-on-rails
activerecord
alexandrecosta
la source
la source
Réponses:
Le résultat de ceci est une collection d'
Model
objets. Pas des évaluations simples. Et duuniq
point de vue de, ils sont complètement différents. Vous pouvez utiliser ceci:ou ceci (le plus efficace)
Mettre à jour
Apparemment, depuis les rails 5.0.0.1, il ne fonctionne que sur les requêtes de "haut niveau", comme ci-dessus. Ne fonctionne pas sur les proxys de collection (relations "has_many", par exemple).
Dans ce cas, dédupliquez après la requête
la source
Model.uniq.pluck(:rating)
c'est le moyen le plus efficace de le faire - cela génère du SQL qui utiliseSELECT DISTINCT
plutôt que de s'appliquer.uniq
à un tableauModel.uniq.pluck(:rating)
seraModel.distinct.pluck(:rating)
Model.related_records.group(:some_column).pluck(:some_column)
Si vous allez utiliser
Model.select
, vous pouvez tout aussi bien l'utiliserDISTINCT
, car il ne renverra que les valeurs uniques. C'est mieux car cela signifie qu'il renvoie moins de lignes et devrait être légèrement plus rapide que de renvoyer un certain nombre de lignes et de dire ensuite à Rails de choisir les valeurs uniques.Bien sûr, cela est fourni à condition que votre base de données comprenne le
DISTINCT
mot - clé, et la plupart le devraient.la source
Model.select("DISTINCT rating").map(&:rating)
pour obtenir une gamme de notes uniquement.Cela fonctionne aussi.
la source
pluck
est une pure méthode Rails> 3.2 qui ne dépend pas de Ruby 1.9.x Voir apidock.com/rails/v3.2.1/ActiveRecord/Calculations/pluckSi vous souhaitez également sélectionner des champs supplémentaires:
la source
select extra fields
<3 <3Cela a l'avantage de ne pas utiliser de chaînes sql et de ne pas instancier de modèles
la source
Ce code fonctionne comme 'DISTINCT' (pas comme Array # uniq) depuis rails 3.2
la source
la source
.pluck(:rating)
à la fin fera exactement ce que le PO a demandé.Si je vais dans le bon sens, alors:
Requête en cours
renvoie un tableau d'objets et vous avez écrit une requête
uniq est appliqué sur un tableau d'objets et chaque objet a un identifiant unique. uniq exécute son travail correctement car chaque objet du tableau est uniq.
Il existe plusieurs façons de sélectionner une note distincte:
ou
ou
ou
Encore une chose, première et deuxième requête: trouver des données distinctes par requête SQL.
Ces requêtes seront considérées comme "londres" et "londres" de la même manière qu'elles négligeront l'espace, c'est pourquoi elles sélectionneront "londres" une fois dans le résultat de votre requête.
Troisième et quatrième requête:
rechercher des données par requête SQL et pour des données distinctes, appliquez ruby uniq mehtod. ces requêtes seront considérées comme "londres" et "londres" différentes, c'est pourquoi il sélectionnera "londres" et "londres" dans le résultat de votre requête.
s'il vous plaît préférez à l'image ci-jointe pour plus de compréhension et jetez un œil sur "Toured / Awaiting RFP".
la source
map
&collect
sont des alias pour la même méthode, il n'est pas nécessaire de fournir des exemples pour les deux.Certaines réponses ne prennent pas en compte l'OP veut un tableau de valeurs
D'autres réponses ne fonctionnent pas bien si votre modèle a des milliers d'enregistrements
Cela dit, je pense qu'une bonne réponse est:
Parce que, tout d'abord, vous générez un tableau de modèles (avec une taille réduite en raison de la sélection), puis vous extrayez le seul attribut de ces modèles sélectionnés (évaluations)
la source
Si quelqu'un cherche la même chose avec Mongoid, c'est
la source
Une autre façon de collecter des colonnes uniq avec sql:
la source