Antworten:
Eine aktive Datensatzabfrage wie diese würde Ihnen meiner Meinung nach das bringen, was Sie wollen ('Etwas' ist der Modellname):
Something.find(:all, :order => "id desc", :limit => 5).reverse
bearbeiten : Wie in den Kommentaren erwähnt, eine andere Möglichkeit:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Dies ist der Rails 3-Weg
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
. Der richtige Ansatz ist SomeModel.limit(5).order('id desc')
per Arthur Neves, was zuSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
Neue Möglichkeit, dies in Schienen 3.1 zu tun, ist SomeModel.limit(5).order('id desc')
last(5)
weil es einen Spielraum für weitere Verkettung zurückgibt.
SomeModel.limit(100).reverse_order
auf Rails 4 ( guides.rubyonrails.org/… ) Es ist das gleiche.
SomeModel.limit(5).order('id desc').pluck(:col)
tun wird , SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
was viel effizienter ist , alle Spalten als Grabbing und alle bis auf eine Spalte mit Verwerfen SomeModel.last(5).map(&:col)
denen tut SELECT *
statt SELECT col
(nicht zupfen kann nach dem Aufruf last; faul-eval Kette endet mit last).
Something.last(5)
weil:
Something.last(5).class
=> Array
so:
Something.last(50000).count
wird wahrscheinlich dein Gedächtnis in die Luft jagen oder ewig dauern.
Something.limit(5).order('id desc')
weil:
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"
Letzteres ist ein nicht bewerteter Bereich. Sie können es verketten oder über in ein Array konvertieren .to_a
. So:
Something.limit(50000).order('id desc').count
... dauert eine Sekunde.
Für Rails 4 und höher Version:
Sie können so etwas versuchen, wenn Sie den ersten ältesten Eintrag möchten
YourModel.order(id: :asc).limit(5).each do |d|
Sie können so etwas ausprobieren, wenn Sie die letzten Einträge wünschen .
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
da es dasselbe ist wieYourModel.order()
Lösung ist hier:
SomeModel.last(5).reverse
Da Rails faul ist, wird es schließlich mit SQL wie folgt in die Datenbank gelangen: "SELECT table
. * FROM table
ORDER BYtable
. id
DESC LIMIT 5".
SomeModel
SELECT
table .* FROM
table` ORDER BY table
. id
DESC LIMIT 5` führt keine Auswahl aller aus
wir können Model.last(5)
oder Model.limit(5).order(id: :desc)
in Schienen 5.2 verwenden
Ich finde, dass diese Abfrage besser / schneller für die Verwendung der "Zupf" -Methode ist, die ich liebe:
Challenge.limit(5).order('id desc')
Dies gibt einen ActiveRecord als Ausgabe; Sie können also .pluck wie folgt verwenden:
Challenge.limit(5).order('id desc').pluck(:id)
Dadurch werden die IDs schnell als Array angezeigt, während der optimale SQL-Code verwendet wird.
Challenge.limit(5).order('id desc').ids
wird genauso gut funktionieren :)
Wenn Sie in Ihrem Modell einen Standardbereich haben, der eine aufsteigende Reihenfolge in Rails 3 angibt, müssen Sie die Neuordnung anstelle der von Arthur Neves oben angegebenen Reihenfolge verwenden:
Something.limit(5).reorder('id desc')
oder
Something.reorder('id desc').limit(5)
Angenommen, N = 5 und Ihr Modell lautet Message
: Sie können Folgendes tun:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Schauen Sie sich die SQL an:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
Der Schlüssel ist die Unterauswahl. Zuerst müssen wir definieren, was die letzten Nachrichten sind, die wir wollen, und dann müssen wir sie in aufsteigender Reihenfolge bestellen.
Fügen Sie der Abfrage einen: order-Parameter hinzu