Comment obtenir les N derniers enregistrements avec activerecord?

Avec :limit in query, j’obtiendrai les N premiers enregistrements. Quelle est la manière la plus simple d’obtenir les N derniers enregistrements?

Une requête d’enregistrement comme celle-ci pourrait vous donner ce que vous voulez (“Quelque chose” est le nom du modèle):

 Something.find(:all, :order => "id desc", :limit => 5).reverse 

edit : Comme noté dans les commentaires, une autre manière:

 result = Something.find(:all, :order => "id desc", :limit => 5) while !result.empty? puts result.pop end 

Ceci est le 3 voies Rails

 SomeModel.last(5) # last 5 records in ascending order SomeModel.last(5).reverse # last 5 records in descending order 

Une nouvelle façon de le faire dans les rails 3.1 est SomeModel.limit(5).order('id desc')

La solution est ici:

 SomeModel.last(5).reverse 

Puisque rails est paresseux, il finira par bash la firebase database avec SQL comme: “SELECT table . * FROM table ORDER BY table . id DESC LIMIT 5″.

Pour les versions Rails 4 et supérieures:

Vous pouvez essayer quelque chose comme ça Si vous voulez la plus ancienne entrée

 YourModel.order(id: :asc).limit(5).each do |d| 

Vous pouvez essayer quelque chose comme ça si vous voulez les dernières dernières entrées ..

 YourModel.order(id: :desc).limit(5).each do |d| 

Pour Rails 5 (et Rails probables 4)

Mal:

 Something.last(5) 

car:

 Something.last(5).class => Array 

alors:

 Something.last(50000).count 

va probablement exploser votre mémoire ou prendre pour toujours.

Bonne approche:

 Something.limit(5).order('id desc') 

car:

 Something.limit(5).order('id desc').class => Image::ActiveRecord_Relation Something.limit(5).order('id desc').to_sql => "SELECT \"somethings\".* FROM \"somethings\" ORDER BY id desc LIMIT 5" 

Ce dernier est une scope non évaluée. Vous pouvez le chaîner ou le convertir en tableau via .to_a . Alors:

 Something.limit(50000).order('id desc').count 

… prend une seconde.

Si vous devez définir des commandes sur les résultats, utilisez:

 Model.order('name desc').limit(n) # n= number 

Si vous n’avez pas besoin de commande et que vous avez juste besoin d’enregistrements enregistrés dans la table, utilisez:

 Model.last(n) # n= any number 

Dans mes projets de rails (rails 4.2) , j’utilise

 Model.last(10) # get the last 10 record order by id 

et il fonctionne.

Je trouve que cette requête est meilleure / plus rapide pour utiliser la méthode “pluck”, que j’adore:

 Challenge.limit(5).order('id desc') 

Cela donne un ActiveRecord comme sortie; donc vous pouvez utiliser .pluck dessus comme ceci:

 Challenge.limit(5).order('id desc').pluck(:id) 

qui donne rapidement les identifiants sous forme de tableau tout en utilisant un code SQL optimal.

Essayez simplement:

 Model.all.order("id asc").limit(5) 

Si vous avez une étendue par défaut dans votre modèle qui spécifie un ordre croissant dans Rails 3, vous devez utiliser la commande réordonner plutôt que l’ordre comme indiqué par Arthur Neves ci-dessus:

 Something.limit(5).reorder('id desc') 

ou

 Something.reorder('id desc').limit(5) 

Disons que N = 5 et que votre modèle est Message , vous pouvez faire quelque chose comme ceci:

 Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages) 

Regardez le sql:

 SELECT "messages".* FROM ( SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5 ) messages ORDER BY "messages"."created_at" ASC 

La clé est la sous-sélection. Nous devons d’abord définir quels sont les derniers messages que nous voulons et ensuite nous devons les classer par ordre croissant.

Ajouter un paramètre: order à la requête