Odpowiedzi:
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
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
. Prawidłowe podejście jest SomeModel.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')
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)
zrobi SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
to znacznie wydajniej niż przechwycenie wszystkich kolumn i odrzucenie wszystkich oprócz jednej kolumny, z SomeModel.last(5).map(&:col)
którą robi SELECT *
zamiast SELECT col
(nie możesz wyciągnąć po wywołaniu last; łańcuch lazy-eval kończy się na last).
Something.last(5)
ponieważ:
Something.last(5).class
=> Array
więc:
Something.last(50000).count
prawdopodobnie zniszczy twoją pamięć lub potrwa wieczność.
Something.limit(5).order('id desc')
ponieważ:
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"
Ten ostatni jest niedocenianym zakresem. Możesz go połączyć w łańcuch lub przekonwertować na tablicę za pośrednictwem .to_a
. Więc:
Something.limit(50000).order('id desc').count
... zajmuje chwilę.
Dla wersji Rails 4 i nowszych:
Możesz spróbować czegoś takiego, jeśli chcesz mieć pierwszy najstarszy wpis
YourModel.order(id: :asc).limit(5).each do |d|
Możesz spróbować czegoś takiego, jeśli chcesz mieć najnowsze wpisy .
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
ponieważ jest tak samo jakYourModel.order()
Rozwiązanie jest tutaj:
SomeModel.last(5).reverse
Ponieważ railsy są leniwe, w końcu trafią do bazy danych z kodem SQL, takim jak: "SELECT table
. * FROM table
ORDER BY table
. id
DESC LIMIT 5".
SomeModel
SELECT
tabela .* FROM
tabela` ORDER BY table
. id
DESC LIMIT 5` nie wykonuje wyboru wszystkiego
możemy użyć Model.last(5)
lub Model.limit(5).order(id: :desc)
w szynach 5.2
Uważam, że to zapytanie jest lepsze / szybsze przy używaniu metody „pluck”, którą uwielbiam:
Challenge.limit(5).order('id desc')
Daje to ActiveRecord jako wyjście; więc możesz użyć .pluck na tym w ten sposób:
Challenge.limit(5).order('id desc').pluck(:id)
który szybko podaje identyfikatory jako tablicę przy użyciu optymalnego kodu SQL.
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:
Something.limit(5).reorder('id desc')
lub
Something.reorder('id desc').limit(5)
Powiedzmy, że N = 5, a Twój model to Message
, możesz zrobić coś takiego:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Spójrz na sql:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
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.
Dodaj parametr: order do zapytania