2009-04-11 8 views
6

Ich versuche, einen Datensatz in der Datenbank zu finden, die den niedrigsten Wert seiner Datetime Spalte hat. In einfacheren Worten, ich möchte einen Datensatz mit der frühesten Zeit finden.Ruby on Rails: Finden Sie den Datensatz mit dem niedrigsten Wert einer bestimmten Spalte

Ich kann Minimum verwenden, um den niedrigsten Wert zu finden, aber das wird nur den Wert selbst zurückgeben, und nicht den ganzen Datensatz.

Ich vermute, ich könnte eine andere Abfrage erstellen, aber ich frage mich, ob es eine effizientere Möglichkeit ist, dies zu tun.

Antwort

17

Dies funktioniert:

earliest = Model.first(:order => 'column asc') 

— Wo Modell der Name Ihrer Modellklasse ist und Spalte ist der Name der Datetime-Spalte. Es wird diese SQL-Anweisung generieren:

SELECT * FROM `Model` ORDER BY column asc LIMIT 1 
+0

Ich weiß, das ist ziemlich spät, aber ist es nicht mot mit '.first' und' 'asc'' innerhalb des Argument-Hash zu': order' –

+1

@AnkitSoni Ohne die 'erste' würde die Abfrage mehrere Datensätze zurückgeben. –

+0

Oh richtig, danke! +1 –

0

Ich bin über RoR nicht sicher, aber mit SQL können Sie nur die Ergebnisse der Abfrage durch das Datetime-Feld sortieren und die Anzahl der Ergebnisse begrenzen 1.

SQL:

SELECT field1,field2,... FROM table ORDER BY datefield LIMIT 1; 

oder vielleicht in Ruby (nicht sicher, obwohl):

table.find(:all, :limit => 1, :order => 'datefield.asc') 
3
Table.first(:order => 'created_on') 
+1

Wenn dies jemals gearbeitet, es scheint nicht 4.1.6 in Rails zu arbeiten. – Ravenstine

2

@Ravenstine Ab Schienen 3, die folgende ist die richtige Syntax

earliest = Model.order('column asc').first 
+1

Dies ist die richtige Antwort, die andere Form wird zu einem Fehler führen – doz87

+0

In 2016 (mindestens Schienen 4) ist dies die richtige Antwort. – Aleks