W :limit
zapytaniu otrzymam pierwsze N rekordów. Jaki jest najłatwiejszy sposób na zdobycie ostatnich N rekordów?
163
W :limit
zapytaniu otrzymam pierwsze N rekordów. Jaki jest najłatwiejszy sposób na zdobycie ostatnich N rekordów?
Wydaje mi się, że takie zapytanie dotyczące rekordu aktywnego dałoby ci to, czego chcesz („Coś” to nazwa modelu):
Something.find(:all, :order => "id desc", :limit => 5).reverse
edycja : jak zauważono w komentarzach, inny sposób:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
To jest 3 sposób Railsów
źródło
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
==Array
. Prawidłowe podejście jestSomeModel.limit(5).order('id desc')
według Arthura Nevesa, co skutkujeSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
nowym sposobem na zrobienie tego w railsach 3.1 jest
SomeModel.limit(5).order('id desc')
źródło
last(5)
to, że zwraca zakres do dalszego łączenia.SomeModel.limit(100).reverse_order
na Rails 4 ( guide.rubyonrails.org/ ... ) To to samo.SomeModel.limit(5).order('id desc').pluck(:col)
zrobiSELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
to znacznie wydajniej niż przechwycenie wszystkich kolumn i odrzucenie wszystkich oprócz jednej kolumny, zSomeModel.last(5).map(&:col)
którą robiSELECT *
zamiastSELECT col
(nie możesz wyciągnąć po wywołaniu last; łańcuch lazy-eval kończy się na last).Dla Rails 5 (i prawdopodobnie Rails 4)
Zły:
ponieważ:
więc:
prawdopodobnie zniszczy twoją pamięć lub potrwa wieczność.
Dobre podejscie:
ponieważ:
Ten ostatni jest niedocenianym zakresem. Możesz go połączyć w łańcuch lub przekonwertować na tablicę za pośrednictwem
.to_a
. Więc:... zajmuje chwilę.
źródło
Dla wersji Rails 4 i nowszych:
Możesz spróbować czegoś takiego, jeśli chcesz mieć pierwszy najstarszy wpis
Możesz spróbować czegoś takiego, jeśli chcesz mieć najnowsze wpisy .
źródło
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
ponieważ jest tak samo jakYourModel.order()
Rozwiązanie jest tutaj:
Ponieważ railsy są leniwe, w końcu trafią do bazy danych z kodem SQL, takim jak: "SELECT
table
. * FROMtable
ORDER BYtable
.id
DESC LIMIT 5".źródło
SomeModel
SELECT
tabela.* FROM
tabela` ORDER BYtable
.id
DESC LIMIT 5` nie wykonuje wyboru wszystkiegoJeśli chcesz ustawić kolejność wyników, użyj:
jeśli nie potrzebujesz żadnego zamówienia, a potrzebujesz tylko rekordów zapisanych w tabeli, użyj:
źródło
W moim
(rails 4.2)
projekcie szyn używami to działa.
źródło
możemy użyć
Model.last(5)
lubModel.limit(5).order(id: :desc)
w szynach 5.2źródło
Spróbuj:
źródło
Uważam, że to zapytanie jest lepsze / szybsze przy używaniu metody „pluck”, którą uwielbiam:
Daje to ActiveRecord jako wyjście; więc możesz użyć .pluck na tym w ten sposób:
który szybko podaje identyfikatory jako tablicę przy użyciu optymalnego kodu SQL.
źródło
Challenge.limit(5).order('id desc').ids
będzie działać równie dobrze :)Jeśli masz domyślny zakres w swoim modelu, który określa kolejność rosnącą w Rails 3, będziesz musiał użyć zmiany kolejności zamiast kolejności określonej przez Arthura Nevesa powyżej:
lub
źródło
Powiedzmy, że N = 5, a Twój model to
Message
, możesz zrobić coś takiego:Spójrz na sql:
Kluczem jest podselekcja. Najpierw musimy zdefiniować, jakie są ostatnie wiadomości, które chcemy, a następnie musimy uporządkować je w kolejności rosnącej.
źródło
Dodaj parametr: order do zapytania
źródło