Rails 4 requête unique par un seul attribut
Donc c'est plus un arel question que tout, mais voici ce que je suis en train de faire.
J'ai trois objets permet de dire, appelés Éléments
<Item id: 1, name: 'Book'>
<Item id: 2, name: 'Car'>
<Item id: 3, name: 'Book'>
Je veux faire une requête qui sera de retour juste à seulement un à chaque "nom" attributs.
Quelque chose comme Item.select('distinct(name), items.*')
Cela ne fonctionne pas bien, il renvoie toujours tous les trois articles.
Comment puis-je forme cette requête qui ne retourne:
<Item id: 1, name: 'Book'>
<Item id: 2, name: 'Car'>
alors, qui livre objet doit-il retourner, 1 ou 3?
n'a pas d'importance, que ce soit des œuvres.
n'a pas d'importance, que ce soit des œuvres.
OriginalL'auteur goddamnyouryan | 2013-08-05
Vous devez vous connecter pour publier un commentaire.
Si vous voulez obtenir la totalité du modèle est de retour, mais encore de maintenir l'unicité, vous pouvez utiliser ceci:
J'ai uniquement testé avec une base de données Postgres. Il peut ou peut ne pas fonctionner avec mysql.
Item.select('distinct on (name) name, id')
C'est génial! Je le cherche partout 🙂
J'ai été à flipper parce que j'ai réalisé que j'avais besoin de récupérer uniquement les enregistrements les plus récents sur une DB, et j'ai dû montrer quelque chose à mon patron, mais pour la vie de moi ne pouvais pas le faire fonctionner jusqu'à ce que j'ai trouvé. Vous êtes un épargnant de vie, que vous!!!
Quelqu'un sait comment je peux réaliser cela avec mysql?
Ce doit être la accepté de répondre.
OriginalL'auteur BananaNeil
Veuillez essayer ceci:
Essayer De L'Élément.select('id', 'nom')
C'est un peu tard, mais voir ma réponse ci-dessous.
OriginalL'auteur vee
Si vous avez seulement besoin d'un tableau avec les noms, sans IDENTIFIANT, vous pouvez le faire:
Résultat de la requête SQL:
** edit **
La
uniq
est couru sur le tableau d'enregistrements. Attention, si vous vous attendez à un grand nombre d'enregistrements.SQL Distincte est beaucoup plus rapide.
Si oui, utiliser vee de la réponse ci-dessus, avec un
map
:Item.select('distinct name').map(:name)
OriginalL'auteur Frexuz
Dans les Rails 4 essayez de
Items.all.to_a.uniq { |item| item.name }
Dans Rails 3, vous devriez être en mesure de faire de
Items.uniq_by { |item| item.name }
Lorsque vous appelez
uniq
sur un tableau, vous pouvez passer un bloc de dicter la façon de déterminer l'unicité. Dans Rails 3, vous avez utilisé pour être en mesure d'utiliseruniq_by
, mais il est devenu obsolète dans les Rails 4. Donc, une méthode que j'ai trouvé est de simplement convertir le ActiveRecord Rapport à un tableau et d'appeluniq
.Très mauvaise idée de
.to_a
une requête qui charge les données dans la mémoire.OriginalL'auteur TalkativeTree
Pour Mysql, vous pouvez utiliser
group
avec ONLY_FULL_GROUP_BY handicapés,Voir Est-il ANY_VALUE capacité de mysql 5.6?
OriginalL'auteur fangxing
Voici un Rails de la moraine d'oak ridges Requête qui va produire le résultat souhaité avec tous les derniers rails versions de rails 5.X.
OriginalL'auteur Ankit Varshney