Je voulais garder une trace de l'utilisateur modifiant leurs adresses électroniques afin que j'ai créé une table "utilisateurs" qui est référencée par une table "e-mails". Le contenu de la table "Utilisateurs" est sans importance pour cette question. La table "Emails" contient une colonne "e-mail" chaîne ainsi que l'habituel "ID", "user_id", "Créé_at", "Mise à jour". Lorsque le courrier électronique d'un utilisateur est modifié, un nouvel enregistrement est ajouté à la table "Emails" qui fait référence à l'utilisateur par "user_id". Donc, tout utilisateur donné pourrait avoir plusieurs adresses électroniques dans la table "e-mails", mais seulement la dernière est la dernière des informations de contact pertinentes.
Les modèles sont configurés comme suit: P>
Email.order(created_at: :desc).group(:user_id)
3 Réponses :
Ce n'est pas jolie, mais ... Si vous avez vraiment besoin d'utiliser Toutefois, si possible , Je vous suggère fortement que vous ajoutez un drapeau IS_PRIMARY à la table pour permettre à un utilisateur de désigner clairement l'adresse e-mail qu'elles s'attendent à être contactées. Vous voudrez également ajouter une logique et des validations pour assurer qu'un seul email par utilisateur_id avait IS_PRIMARY = true. P> Ce changement éliminerait également la nécessité de la requête groupée imbriquée que vous avez été forcée de découvrir ici. P > p> créé_at code> pour déterminer la commande, alors aussi longtemps que
Created_AT CODE> Les valeurs sont uniques, vous pouvez remplacer
ID code> ci-dessus avec
créé_at code> et obtenir les mêmes résultats. P>
Je suis répugnant de le dire, mais vous avez peut-être raison d'ajouter un drapeau "is_primary". Votre solution fonctionne dans MySQL, mais cela ne fonctionne pas dans SQLite, que j'utilise pour les essais initiaux. Le drapeau "IS_PRIMARY" pourrait être la solution la plus compatible.
Il peut y avoir plusieurs façons de le faire, vous pouvez essayer celui-ci:
Email.all.group(:user_id).order("max(emails.created_at) DESC")
Cela me donne toujours le dossier le plus ancien d'un groupe, pas le dernier.
Essayez ceci
Cela me donne le plus ancien email pour chaque utilisateur. J'ai besoin du plus récent email pour chaque utilisateur.
Ajoutez ensuite cette ligne à la fin "Emails = commandded_emails.Reverse!"