Comment obtenir les N derniers enregistrements avec activerecord?
Avec :limit
dans la requête, je vais obtenir des N premiers enregistrements. Quelle est la façon la plus simple pour obtenir les dernières enregistrements N?
Vous devez vous connecter pour publier un commentaire.
Active à une requête d'enregistrement comme cela, je pense que vous obtiendrez ce que vous voulez ("quelque Chose" est le nom du modèle):
modifier: Comme indiqué dans les commentaires, une autre façon:
Something.last(n)
à la place.C'est les Rails de 3 façon
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
==Array
. La bonne approche est deSomeModel.limit(5).order('id desc')
par Arthur Neves, qui résultats dansSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
nouvelle façon de faire dans les rails 3.1 est
SomeModel.limit(5).order('id desc')
last(5)
parce qu'elle renvoie un champ d'application pour plus de chaînage.SomeModel.limit(100).reverse_order
sur Rails 4 (guides.rubyonrails.org/...) C'est la même chose.SomeModel.limit(5).order('id desc').pluck(:col)
feraSELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
qui est beaucoup plus efficace que de prendre toutes les colonnes et le rejet de tous, mais une seule colonne avecSomeModel.last(5).map(&:col)
qui neSELECT *
au lieu deSELECT col
(vous ne pouvez pas arracher après l'appel de dernière; paresseux-eval chaîne se termine avec le dernier).Pour Rails 4 et au-dessus de la version:
Vous pouvez essayer quelque chose comme cela Si vous voulez première entrée la plus ancienne
Vous pouvez essayer quelque chose comme cela si vous voulez dernier dernières entrées..
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
parce que c'est le même queYourModel.order()
Solution est ici:
Depuis des rails est paresseux, il sera finalement frapper la base de données avec SQL comme: "SÉLECTIONNEZ
table
.* DEtable
COMMANDE PARtable
.id
DESC LIMIT 5".SomeModel
SELECT
table.* FROM
table` COMMANDE PARtable
.id
DESC LIMIT 5", il n' pas sélectionner un ensemblePour les Rails 5 (et probablement Rails 4)
Mauvais:
parce que:
donc:
va probablement exploser votre mémoire ou prendre une éternité.
Bonne approche:
parce que:
Ce dernier est non évalué la portée. Vous pouvez la chaîne, ou la convertir en un tableau via
.to_a
. Donc:... prend une seconde.
Si vous devez configurer certains de commande sur les résultats, utilisation:
si vous n'avez pas besoin de commander, et juste besoin de dossiers enregistrés dans la table, alors utilisez:
Dans mon rails
(rails 4.2)
projet, j'utiliseet il fonctionne.
Je trouve que cette requête est mieux/plus vite à l'aide de la "arracher" la méthode, que j'aime beaucoup:
Cela donne une ActiveRecord que la sortie; de sorte que vous pouvez utiliser .plumer comme ceci:
qui donne rapidement les id dans un tableau lors de l'utilisation optimale du code SQL.
Challenge.limit(5).order('id desc').ids
fonctionnera tout aussi bien 🙂Juste essayer:
Si vous avez un défaut de la portée de votre modèle qui spécifie un ordre croissant dans Rails 3, vous aurez besoin d'utiliser réorganiser plutôt que de commande telle que précisée par Arthur Neves ci-dessus:
ou
Disons N = 5 et votre modèle est
Message
, vous pouvez faire quelque chose comme ceci:Regarder le sql:
La clé est celle-ci. Nous devons d'abord définir ce que sont les derniers messages que nous voulons et puis nous avons à les ordonner dans l'ordre croissant.
Ajouter un :paramètre d'ordre à la requête