0
votes

Actioniverecord Query pour chaque adresse e-mail de chaque utilisateur dans une table des adresses électroniques

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)


0 commentaires

3 Réponses :


0
votes

Ce n'est pas jolie, mais ... xxx

Si vous avez vraiment besoin d'utiliser créé_at pour déterminer la commande, alors aussi longtemps que Created_AT Les valeurs sont uniques, vous pouvez remplacer ID ci-dessus avec créé_at et obtenir les mêmes résultats.

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.

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.


1 commentaires

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.



0
votes

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")


1 commentaires

Cela me donne toujours le dossier le plus ancien d'un groupe, pas le dernier.



0
votes

Essayez ceci xxx


2 commentaires

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!"