Avec :limit
en requête, j'obtiendrai N premiers enregistrements. Quelle est la manière la plus simple d'obtenir les N derniers enregistrements?
163
Avec :limit
en requête, j'obtiendrai N premiers enregistrements. Quelle est la manière la plus simple d'obtenir les N derniers enregistrements?
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
la source
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
==Array
. L'approche correcte estSomeModel.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')
la source
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 ceSELECT 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 avecSomeModel.last(5).map(&:col)
qui faitSELECT *
au lieu deSELECT col
(vous ne pouvez pas cueillir après avoir appelé last; la chaîne lazy-eval se termine par le dernier).Pour les rails 5 (et probablement les rails 4)
Mauvais:
car:
alors:
va probablement exploser votre mémoire ou prendre une éternité.
Bonne approche:
car:
Ce dernier est un périmètre non évalué. Vous pouvez le chaîner ou le convertir en tableau via
.to_a
. Alors:... prend une seconde.
la source
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
Vous pouvez essayer quelque chose comme ceci si vous voulez les dernières dernières entrées .
la source
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
car c'est le même queYourModel.order()
La solution est ici:
Puisque rails est paresseux, il finira par atteindre la base de données avec SQL comme: "SELECT
table
. * FROMtable
ORDER BYtable
.id
DESC LIMIT 5".la source
SomeModel
SELECT
table.* FROM
table` ORDER BYtable
.id
DESC LIMIT 5` il n'effectue pas de sélection de toutSi vous avez besoin de définir un ordre sur les résultats, utilisez:
si vous n'avez besoin d'aucune commande et que vous avez juste besoin d'enregistrements enregistrés dans la table, utilisez:
la source
Dans mon
(rails 4.2)
projet de rails , j'utiliseet il fonctionne.
la source
on peut utiliser
Model.last(5)
ouModel.limit(5).order(id: :desc)
en rails 5.2la source
Essayez simplement:
la source
Je trouve que cette requête est meilleure / plus rapide pour utiliser la méthode "pluck", que j'adore:
Cela donne un ActiveRecord comme sortie; vous pouvez donc utiliser .pluck dessus comme ceci:
qui donne rapidement les identifiants sous forme de tableau tout en utilisant un code SQL optimal.
la source
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:
ou
la source
Disons que N = 5 et votre modèle est
Message
, vous pouvez faire quelque chose comme ceci:Regardez le sql:
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.
la source
Ajouter un paramètre: order à la requête
la source