web-dev-qa-db-fra.com

Trouvez le dernier enregistrement dans Rails 3

Je me demandais s'il y avait un moyen de trouver le dernier enregistrement dans un tableau dans Rails 3?

Merci

Elliot

55
Elliot

Étant donné un modèle Post, vous pouvez faire @post = Post.order("created_at").last

(La raison pour laquelle je n'ai pas simplement fait un @post = Post.last est dû au fait que le tri par défaut est toujours effectué par votre clé primaire (généralement id). La plupart du temps, cela va bien, mais je suis sûr qu'il y a un scénario où cela pourrait causer des problèmes (par exemple, définir des ID personnalisés sur les enregistrements, des modifications de la base de données qui affectent la séquence de clés primaires/la numérotation automatique, etc.). Tri par created_at l'horodatage garantit que vous obtenez réellement l'enregistrement le plus récent).

119
Dylan Markow

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 se développe.

Si vous savez que votre colonne "id" est une clé primaire à incrémentation automatique (ce qu'elle est probablement), alors utilisez-la simplement car c'est un index par définition.

De plus, à moins qu'AREL ne soit optimisé pour sélectionner un seul enregistrement dans une recherche (: last), vous courez le risque de lui faire sélectionner TOUS les enregistrements, puis vous renvoyez le dernier en utilisant la méthode "last ()". Plus efficace est de limiter les résultats à un:

MyModel.last(:order => "id asc", :limit => 1)

ou

MyModel.first(:order => "id desc", :limit => 1)
21
jemminger

vous pouvez rencontrer des problèmes d'ambiguïté en utilisant created_at sur une table suffisamment fréquentée.

par exemple. essayer:

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. une sorte les retournerait dans aucun ordre particulier.

vous feriez mieux de stocker une valeur microtime et de la trier.

3
RUN-CMD

Oui, vous pouvez utiliser la méthode .last

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

>> Post.last
=> #<Post ...>
2
DanneManne

Essayez, pour un modèle nommé ModelName:

record = ModelName.last
1
Sam Ritchie