Mit :limit
in Abfrage bekomme ich erste N Datensätze. Was ist der einfachste Weg, um die letzten N Datensätze zu erhalten?
163
Mit :limit
in Abfrage bekomme ich erste N Datensätze. Was ist der einfachste Weg, um die letzten N Datensätze zu erhalten?
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
quelle
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
==Array
. Der richtige Ansatz istSomeModel.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')
quelle
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 VerwerfenSomeModel.last(5).map(&:col)
denen tutSELECT *
stattSELECT col
(nicht zupfen kann nach dem Aufruf last; faul-eval Kette endet mit last).Für Schienen 5 (und wahrscheinlich Schienen 4)
Schlecht:
weil:
so:
wird wahrscheinlich dein Gedächtnis in die Luft jagen oder ewig dauern.
Guter Ansatz:
weil:
Letzteres ist ein nicht bewerteter Bereich. Sie können es verketten oder über in ein Array konvertieren
.to_a
. So:... dauert eine Sekunde.
quelle
Für Rails 4 und höher Version:
Sie können so etwas versuchen, wenn Sie den ersten ältesten Eintrag möchten
Sie können so etwas ausprobieren, wenn Sie die letzten Einträge wünschen .
quelle
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
da es dasselbe ist wieYourModel.order()
Lösung ist hier:
Da Rails faul ist, wird es schließlich mit SQL wie folgt in die Datenbank gelangen: "SELECT
table
. * FROMtable
ORDER BYtable
.id
DESC LIMIT 5".quelle
SomeModel
SELECT
table.* FROM
table` ORDER BYtable
.id
DESC LIMIT 5` führt keine Auswahl aller ausWenn Sie eine Reihenfolge für die Ergebnisse festlegen müssen, verwenden Sie:
Wenn Sie keine Bestellung benötigen und nur in der Tabelle gespeicherte Datensätze benötigen, verwenden Sie:
quelle
In meinem Rails-
(rails 4.2)
Projekt verwende ichund es funktioniert.
quelle
wir können
Model.last(5)
oderModel.limit(5).order(id: :desc)
in Schienen 5.2 verwendenquelle
Probier's einfach:
quelle
Ich finde, dass diese Abfrage besser / schneller für die Verwendung der "Zupf" -Methode ist, die ich liebe:
Dies gibt einen ActiveRecord als Ausgabe; Sie können also .pluck wie folgt verwenden:
Dadurch werden die IDs schnell als Array angezeigt, während der optimale SQL-Code verwendet wird.
quelle
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:
oder
quelle
Angenommen, N = 5 und Ihr Modell lautet
Message
: Sie können Folgendes tun:Schauen Sie sich die SQL an:
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.
quelle
Fügen Sie der Abfrage einen: order-Parameter hinzu
quelle