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?
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
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
nouvelle façon de le faire dans Rails 3.1 est SomeModel.limit(5).order('id desc')
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|
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 ".
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.
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.
Dans mon Rails (Rails 4.2)
projet, j'utilise
Model.last(10) # get the last 10 record order by id
et il fonctionne.
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
Essayez juste:
Model.order("field_for_sort desc").limit(5)
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.
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.
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)