2011-02-02 7 views
45

Me preguntaba si hay alguna manera de encontrar el registro más nuevo en una tabla en rails3.Encuentra el registro más nuevo en Rails 3

Gracias

Elliot

+0

Necesitamos saber más sobre la tabla de la que está hablando. ¿Existe un campo de fecha y hora que se actualice automáticamente cuando se agrega y/o se modifica un registro? –

Respuesta

98

Dado un modelo Post, que podría hacer @post = Post.order("created_at").last

(La razón por la que no se limitó a hacer un @post = Post.last se debe a que siempre se ordena de forma predeterminada por su clave principal (generalmente id). La mayoría de si esto está bien, pero estoy seguro de que hay un escenario donde eso podría causar problemas (p. establecer ID personalizados en los registros, cambios en la base de datos que afectan la secuencia principal de claves/autonumeración, etc.). Ordenando por la marca de tiempo created_at asegura que realmente está obteniendo el registro más reciente).

+9

Asegúrese de indexar ese campo created_at si usa este método. – jemminger

+1

No funcionaré en el gancho 'before_validation'. – Green

+1

En Rails 4, también puede agregar la línea 'default_scope {order (created_at:: asc)}' al modelo de publicación para asegurarse de que 'Post.last' se comporte como se esperaba. – sambecker

1

intento, para un modelo llamado ModelName:

record = ModelName.last 
+2

Esto no tiene en cuenta el orden de clasificación de la tabla. Fallaría si se usa la base de datos de postgres – jamesc

+1

Fallaría ... genial. ¿Qué harías para evitar el fracaso? –

3

Sí, puede utilizar el método .last

Así que si su modelo se llama post a continuación:

>> Post.last 
=> #<Post ...> 
18

Si bien la respuesta de dmarkow es técnicamente correcto, se tendrá que hacer un índice en created_at o arriesgarse a una consulta cada vez más lenta a medida que crece su base de datos.

Si sabe que su columna "id" es una clave primaria de incremento automático (que probablemente sea), simplemente úsela ya que es un índice por definición.

Además, a menos que AREL esté optimizado para seleccionar solo un registro en un find (: last), se corre el riesgo de seleccionar TODOS los registros y luego devolver el último utilizando el método "last()" . Más eficiente es limitar los resultados a uno:

MyModel.last(:order => "id asc", :limit => 1) 

o

MyModel.first(:order => "id desc", :limit => 1) 
+6

'@post = Post.order (" created_at "). Last' en realidad hace lo correcto.La salida de la consola es algo así como 'SELECCIONAR' las publicaciones ". * DESDE" publicaciones "ORDER BY" publicaciones "." Created_at "DESC LIMIT 1 ' – PhilT

2

es posible que encuentre problemas de ambigüedad utilizando created_at en una mesa lo suficientemente alto tráfico.

por ejemplo. Proveedores:

INSERT INTO table (created_at) VALUES (NOW()); 
INSERT INTO table (created_at) VALUES (NOW()); 

..has el potencial de tener el mismo created_at, que sólo tiene 1 segundo de la resolución. un género los devolvería sin un orden particular.

puede que sea mejor guardar un valor de microtime y ordenarlo.

Cuestiones relacionadas