web-dev-qa-db-fra.com

Comment obtenir les derniers N enregistrements avec activerecord?

Avec :limit dans la requête, j'obtiendra d'abord N enregistrements. Quel est le moyen le plus simple d’obtenir les N derniers enregistrements?

154
JtR

Je pense qu'une requête d'enregistrement active comme celle-ci vous donnerait ce que vous voulez ("Quelque chose" correspond au nom du modèle):

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

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

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

while !result.empty?
        puts result.pop
end
140
Dan McNevin

C’est le Rails 3 voies

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

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

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

50
Arthur Neves

Pour Rails 4 et versions supérieures:

Vous pouvez essayer quelque chose comme ceci Si vous voulez première entrée la plus ancienne

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

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

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

La solution est là:

SomeModel.last(5).reverse

Puisque Rails est fainéant, il frappera éventuellement la base de données avec le code SQL, comme suit: "SELECT table. * FROM table ORDER BY table. id DESC LIMIT 5 ".

25
Developer

Pour Rails 5 (et probablement Rails 4)

Mauvais:

Something.last(5)

parce que:

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

parce que:

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 un champ non évalué. Vous pouvez le chaîner ou le convertir en tableau via .to_a. Alors:

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

... prend une seconde.

24
Amin Ariana

Dans mon Rails (Rails 4.2) projet, j'utilise

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

et il fonctionne.

4
timlentse

Si vous devez définir un classement en fonction des résultats, utilisez:

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

si vous n'avez besoin d'aucun ordre et que vous avez simplement besoin d'enregistrements sauvegardés dans la table, utilisez:

Model.last(n) # n= any number
4
Thorin

Essayez juste:

Model.order("field_for_sort desc").limit(5)
2
Thorin

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; afin que vous puissiez 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.

1
Brandon Meredith

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.

0
MatayoshiMariano

Si vous avez une étendue par défaut dans votre modèle qui spécifie un ordre croissant dans Rails 3, vous devrez utiliser réorganiser plutôt que dans l'ordre spécifié par Arthur Neves ci-dessus:

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

ou

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