Wie letzte N Datensätze mit Active zu bekommen?
-
05-07-2019 - |
Frage
Mit :limit
in Abfrage, werde ich zuerst N Datensätze erhalten. Was ist der einfachste Weg letzten N Aufzeichnungen zu bekommen?
Lösung
Eine aktive Datensatz Abfrage wie folgt ich denke, dass Sie bekommen, 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 Art und Weise:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Andere Tipps
Dies ist die Rails 3 Art und Weise
SomeModel.last(5) # last 5 records in ascending order
SomeModel.last(5).reverse # last 5 records in descending order
neue Art und Weise es in Schienen zu tun 3.1 ist SomeModel.limit(5).order('id desc')
Schienen 4 und höher Version:
Sie können so etwas wie dies versuchen Wenn Sie zuerst älteste Eintrag
YourModel.order(id: :asc).limit(5).each do |d|
Sie können so etwas wie diese versuchen, wenn Sie wollen letzte neuesten Einträge ..
YourModel.order(id: :desc).limit(5).each do |d|
Die Lösung ist hier:
SomeModel.last(5).reverse
Da Schienen faul ist, wird es trifft schließlich die Datenbank mit SQL wie: "SELECT * FROM table
table
ORDER BY table
.id
DESC LIMIT 5".
Für Rails 5 (und Rails wahrscheinlich 4)
Bad:
Something.last(5)
da:
Something.last(5).class
=> Array
so:
Something.last(50000).count
wird wahrscheinlich Ihr Gedächtnis sprengen oder ewig dauern.
Good Ansatz:
Something.limit(5).order('id desc')
da:
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 unevaluierten Umfang. Sie können die Kette es, oder es über .to_a
in ein Array umwandeln. Also:
Something.limit(50000).order('id desc').count
... nimmt eine Sekunde.
Wenn Sie eine Bestellung auf die Ergebnisse und stellen Sie dann verwenden:
Model.order('name desc').limit(n) # n= number
Wenn Sie keine Bestellung benötigen, und nur Datensätze in der Tabelle gespeichert müssen dann verwenden:
Model.last(n) # n= any number
In meinen Schiene (rails 4.2)
Projekt verwende ich
Model.last(10) # get the last 10 record order by id
und es funktioniert.
Ich finde, dass diese Abfrage ist besser / schneller für die Verwendung der „zupft“ Methode, die ich liebe:
Challenge.limit(5).order('id desc')
Das gibt ein Active als Ausgang; so können Sie .pluck auf es wie folgt verwendet werden:
Challenge.limit(5).order('id desc').pluck(:id)
, die schnell den ids als Array gibt und gleichzeitig ein optimalen SQL-Code.
Versuchen Sie einfach:
Model.all.order("id asc").limit(5)
Wenn Sie einen Standardbereich in Ihrem Modell, das eine aufsteigende Reihenfolge in Rails 3 gibt die Sie benötigen, Neuordnungs zu verwenden, anstatt angegebene Reihenfolge wie von Arthur Neves über:
Something.limit(5).reorder('id desc')
oder
Something.reorder('id desc').limit(5)
Lassen Sie uns sagen, N = 5 und Ihr Modell Message
ist, können Sie etwas tun können:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Sehen Sie sich die SQL:
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 subselect. Zuerst müssen wir definieren, was die letzten Meldungen sind wir wollen, und dann müssen wir sie, um in aufsteigender Reihenfolge.
Fügen Sie ein: Um Parameter für die Abfrage