Frage

Mit :limit in Abfrage, werde ich zuerst N Datensätze erhalten. Was ist der einfachste Weg letzten N Aufzeichnungen zu bekommen?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top