Je me demandais s'il existe un moyen de trouver l'enregistrement le plus récent dans une table dans rails3 ?
Cela ne tient pas compte de l'ordre de tri de la table. Cela échouerait si vous utilisez la base de données Postgres.
Je me demandais s'il existe un moyen de trouver l'enregistrement le plus récent dans une table dans rails3 ?
Étant donné un modèle de poste, vous pourriez faire @post = Post.order("created_at").last
(La raison pour laquelle je n'ai pas juste fait un @post = Post.last
c'est parce que le tri se fait toujours par défaut sur votre clé primaire (généralement id
). La plupart du temps, c'est très bien, mais je suis sûr qu'il y a un scénario où cela pourrait causer des problèmes (par exemple, la mise en place d'ID personnalisés sur les enregistrements, les changements de base de données qui affectent le séquençage/autonumérotation de la clé primaire, etc). Le tri par la clé primaire created_at
garantit que vous obtenez réellement l'enregistrement le plus récent).
Bien que la réponse de dmarkow soit techniquement correcte, vous devrez créer un index sur created_at ou risquer une requête de plus en plus lente à mesure que votre base de données s'agrandit.
Si vous savez que votre colonne "id" est une clé primaire à incrémentation automatique (ce qui est probablement le cas), alors utilisez-la simplement puisqu'il s'agit d'un index par définition.
De plus, à moins que AREL ne soit optimisé pour ne sélectionner qu'un seul enregistrement dans un find(:last), vous courez le risque de lui faire sélectionner TOUS les enregistrements, puis de ne vous renvoyer que le dernier en utilisant la méthode "last()". Il est plus efficace de limiter les résultats à un seul :
MyModel.last(:order => "id asc", :limit => 1)
ou
MyModel.first(:order => "id desc", :limit => 1)
Vous pouvez rencontrer des problèmes d'ambiguïté en utilisant created_at
sur une table suffisamment fréquentée.
Par exemple, essayez :
INSERT INTO table (created_at) VALUES ( NOW() );
INSERT INTO table (created_at) VALUES ( NOW() );
a le potentiel d'avoir le même created_at
qui n'a qu'une seconde de résolution. Un tri les renverrait sans ordre particulier.
il est préférable de stocker une valeur micro temporelle et de trier sur cette base.
Ce n'est pas toujours vrai dans certains cas, notamment lorsque le type d'identifiant est une chaîne générée de manière aléatoire, donc pour être sûr, utilisez Post.order("created_at DESC").first pour obtenir le message le plus récent créé en fonction de l'heure de création, ou si vous dépendez de la date de mise à jour, vous pouvez utiliser Post.order("updated_at DESC").first.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Nous avons besoin d'en savoir plus sur la table dont vous parlez. Existe-t-il un champ de date qui est automatiquement mis à jour lorsqu'un enregistrement est ajouté et/ou modifié ?