67 votes

Trouver l'enregistrement le plus récent dans Rails 3

Je me demandais s'il existe un moyen de trouver l'enregistrement le plus récent dans une table dans rails3 ?

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é ?

139voto

Dylan Markow Points 65796

É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).

22voto

antrobot123 Points 1

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)

3voto

RUN-CMD Points 21

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.

1voto

Sam Ritchie Points 7787

Essayez, pour un modèle nommé ModelName :

record = ModelName.last

4 votes

Cela ne tient pas compte de l'ordre de tri de la table. Cela échouerait si vous utilisez la base de données Postgres.

2 votes

Il y aurait un échec... génial. Que feriez-vous pour éviter l'échec ?

1voto

DanneManne Points 13408

Oui, vous pouvez utiliser la méthode .last

Donc si votre modèle s'appelle Post alors :

>> Post.last
=> #<Post ...>

0 votes

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.com

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.

Powered by:

X