2011-02-02 23 views
45

mi chiedevo se theres un modo per trovare il nuovo record in una tabella in Rails3?Trovare il nuovo record di Rails 3

Grazie

Elliot

+0

abbiamo bisogno di sapere di più sul tavolo si sta parlando. Esiste un campo datetime che viene automaticamente aggiornato quando un record viene aggiunto e/o modificato? –

risposta

98

Dato un modello Post, si potrebbe fare @post = Post.order("created_at").last

(Il motivo per cui non l'ho fatto solo fare un @post = Post.last è perché questo è sempre predefinito per ordinare dalla chiave primaria (di solito id). il tempo va bene, ma sono sicuro che c'è uno scenario in cui ciò potrebbe causare problemi (ad es. impostazione di ID personalizzati su record, modifiche al database che influiscono sulla sequenza di chiavi primaria/autonumbering, ecc.). L'ordinamento in base al timestamp created_at garantisce che stai ottenendo davvero il record più recente).

+9

Assicurarsi di indicizzare il campo created_at se si utilizza questo metodo. – jemminger

+1

Non lavorerò nell'avviso 'before_validation'. – Green

+1

In Rails 4, puoi anche aggiungere la riga 'default_scope {order (created_at:: asc)}' al modello Post per assicurarti che 'Post.last' si comporti come previsto. – sambecker

1

prova, per un modello di nome ModelName:

record = ModelName.last 
+2

Questo non prende in considerazione l'ordinamento per la tabella. Fallirebbe se si usasse il database postgres – jamesc

+1

Fallirebbe ... ottimo. Cosa faresti per evitare il fallimento? –

3

Sì, è possibile utilizzare il metodo .last

Così, se il modello si chiama Messaggio quindi:

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

Mentre la risposta di dmarkow è tecnicamente corretto, avrete bisogno di fare un indice su created_at o rischi una query sempre più lenta man mano che il tuo database cresce.

Se sai che la tua colonna "id" è una chiave primaria di auto-incremento (che probabilmente è), poi basta usarlo dal momento che è un indice per definizione.

Inoltre, a meno che AREL non sia ottimizzato per selezionare solo un record in un find (: last), si corre il rischio di farlo selezionare ALL records, quindi si restituisce solo l'ultimo utilizzando il metodo "last()" . Più efficiente è quello di limitare i risultati a uno:

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

o

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

'@post = Post.order (" created_at "). Last' effettivamente fa la cosa giusta.L'output della console è qualcosa come "SELECT" post ". * FROM" posts "ORDER BY" posts "." Created_at "DESC LIMIT 1' – PhilT

2

si può incorrere in problemi di ambiguità utilizzando created_at su un tavolo sufficientemente alto traffico.

es. prova:

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

..has il potenziale per avere la stessa created_at, che ha solo 1 secondo di risoluzione. una specie li restituirebbe senza un ordine particolare.

si può essere meglio memorizzare un valore microtime e smistamento su questo.

Problemi correlati