Je fais de mon mieux pour plier mon cerveau autour d'Arel et l'algèbre relationnelle derrière elle, mais comment représenter un Merci beaucoup! P> P> Sélectionner distinct code> éluise de manière constante ma compréhension. Quelqu'un peut-il expliquer comment arel:
6 Réponses :
Mise à jour 1: strong> p> au moment de la poste, ce n'était pas disponible en arel. Ces jours-ci, ActiveRecord :: QueryMethods possède la méthode update 2: strong>
On dirait que Arel soutient maintenant ce comportement. @maerics a la bonne réponse. Je supprimerais ceci si ce n'était pas la réponse acceptée. P> p> post.sélectionnez ("Titre distinct") Code>
UNIQ code> ( http: / /APidock.com/Rails/acterecord/QueryMethods/uniq ), vous souhaiteriez donc: p>
Pas exactement algébrique, mais difficile à argumenter avec son efficacité ;-)
Il existe un problème mortel avec cette approche: si vous avez plus d'une portée avec une instruction SELECT, les chaînait ensemble peut provoquer une SQL invalide.
Ce n'est pas arel, et donc il ne répond pas à la question.
La réponse précédente est la voie des rails, non? Pas la voie arelle.
Ceci fonctionne pour Arel A > 1.x: p> Je suppose qu'il y a une autre façon "plus correcte" de le faire via l'API, mais je n'ai pas encore compris cela. P > p>
C'est vrai. Cette réponse était pour Arel 1.x et ne fonctionnera plus.
Savez-vous quelle est l'alternative?
Si vous faites cela à l'aide d'une portée:
scope :recent, lambda {|count| select("DISTINCT posts.*"). joins(:whatever). limit(count). order("posts.updated_at DESC") }
Étant donné que Arel utilise toujours défini dans son fonctionnement, les résultats de la ligne en double seront supprimés automatiquement. Utilisez simplement une opération de projet normal (PHI). P>
C'est une bonne idée en théorie mais il est manifestement faux en réalité. Les requêtes Arel reviendront des entrées en double de toute projection, sauf contrainte de la méthode «distincte» explicitement.
à l'aide d'une arelle pure (pas de rails / activerecord) Il existe une méthode "distincte": curieusement, la méthode "distincte" n'est pas cha chaînable, par les autres méthodes arle. p> p>
Avec la version arelle, 5.0.1 code>, cela ne fonctionne plus :(.
Arel 6, tout fonctionne parfaitement. C'est aussi chaînéable, car il retourne SelectManager.
Arel 6.0.3 Et cela a sauvé ma journée, bien que j'utilisais distinct_on code>
Le moyen arel de le faire est:
t = Arel::Table.new(:foo) count_distinct = t[:field].count(true) count_distinct.to_sql # => "COUNT(DISTINCT `foo`.`field`)"
Cela ne répond pas strictement à la question mais il est possible de répondre à ma question i> question: comment exprimer comptez (distinct attr) code> en utilisant arel.
Je ne connais pas l'arelle mais de ma lecture de "base de données en profondeur" par C.J.Date, en algèbre relationnelle, le résultat d'une requête est un ensemble de tuples. Donc, si Arel suit cette théorie que distinct doit être la valeur par défaut.