Réponses:
Une requête d'enregistrement active comme celle-ci, je pense, vous permettrait d'obtenir ce que vous voulez (`` Quelque chose '' est le nom du modèle):
Something.find(:all, :order => "id desc", :limit => 5).reverse
edit : Comme indiqué dans les commentaires, une autre façon:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
C'est la voie 3 Rails
SomeModel.last(5) # last 5 records in ascending order
SomeModel.last(5).reverse # last 5 records in descending order
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
== Array
. L'approche correcte est SomeModel.limit(5).order('id desc')
par Arthur Neves, ce qui se traduit parSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
la nouvelle façon de le faire dans les rails 3.1 est SomeModel.limit(5).order('id desc')
last(5)
parce que cela renvoie une possibilité de chaînage supplémentaire.
SomeModel.limit(100).reverse_order
sur Rails 4 ( guides.rubyonrails.org / ... ) C'est pareil.
SomeModel.limit(5).order('id desc').pluck(:col)
fera ce SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
qui est beaucoup plus efficace que de saisir toutes les colonnes et de supprimer toutes les colonnes sauf une avec SomeModel.last(5).map(&:col)
qui fait SELECT *
au lieu de SELECT col
(vous ne pouvez pas cueillir après avoir appelé last; la chaîne lazy-eval se termine par le dernier).
Something.last(5)
car:
Something.last(5).class
=> Array
alors:
Something.last(50000).count
va probablement exploser votre mémoire ou prendre une éternité.
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 un périmètre 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.
Pour Rails 4 et version supérieure:
Vous pouvez essayer quelque chose comme ceci Si vous voulez la première entrée la plus ancienne
YourModel.order(id: :asc).limit(5).each do |d|
Vous pouvez essayer quelque chose comme ceci si vous voulez les dernières dernières entrées .
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
car c'est le même queYourModel.order()
La solution est ici:
SomeModel.last(5).reverse
Puisque rails est paresseux, il finira par atteindre la base de données avec SQL comme: "SELECT table
. * FROM table
ORDER BY table
. id
DESC LIMIT 5".
SomeModel
SELECT
table .* FROM
table` ORDER BY table
. id
DESC LIMIT 5` il n'effectue pas de sélection de tout
on peut utiliser Model.last(5)
ou Model.limit(5).order(id: :desc)
en rails 5.2
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; vous pouvez donc 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.
Challenge.limit(5).order('id desc').ids
fonctionnera tout aussi bien :)
Si vous avez une portée par défaut dans votre modèle qui spécifie un ordre croissant dans Rails 3, vous devrez utiliser la réorganisation plutôt que l'ordre comme spécifié par Arthur Neves ci-dessus:
Something.limit(5).reorder('id desc')
ou
Something.reorder('id desc').limit(5)
Disons que N = 5 et 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, puis nous devons les ordonner par ordre croissant.
Ajouter un paramètre: order à la requête