2013-08-13 11 views
13

Nella mia app ho creato una funzione di post recenti.Rails 4 Relazione n. Tutti deprecazione

@recentposts = Post.all(:order => 'created_at DESC', :limit => 5) 

Questa variabile presenta alcuni problemi. Quando eseguo i test che ho il seguente errore:

DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. Post.where(published: true).load). If you want to get an array of records from a relation, you can call #to_a (e.g. Post.where(published: true).to_a). (called from show at /home/mateusz/rails4/Bloggers/app/controllers/users_controller.rb:18)

ero seraching soluzione su Google, ma io non lo trovo ...

risposta

18

Basta scrivere:

@recentposts = Post.order('created_at DESC').limit(5) 

Il to_a non è esplicitamente necessaria, in quanto i dati è caricato in modo pigro quando necessario.

+0

Mentre io sono all in per pigro carico, era chiedendo la linea equivalente. Se sta migrando il codice, probabilmente vuole mantenere tutto il più vicino possibile a ciò che è giusto? – bluehallu

+0

Cerco di pensare ad un passo avanti. Sì, se identico è ciò che l'OP vuole. Prima non c'era alternativa, personalmente credo che sia meglio caricare i dati solo quando necessario. Per esempio. in questo modo puoi ancora perfezionare in seguito e aggiungere gli ambiti quando necessario. Questo può rendere il codice molto pulito. – nathanvda

+0

Sì, ho già detto che sono all in per il carico pigro ma, di nuovo, se sta solo provando a migrare un'app, tenere tutto il più vicino possibile è probabilmente l'idea migliore a meno che non conosca abbastanza l'app per cambiarla. – bluehallu

10

Una chiamata a Post.all restituirà un ActiveRecord::Relation, che sarà caricata pigramente per impostazione predefinita. Chiamando il numero Post.all.load verrà restituito uno ActiveRecord::Relation caricato con entusiasmo. Infine, chiamando Post.all.to_a verranno restituiti tutti i record in un array.

Nel tuo caso si dovrebbe fare:

Post.order('created_at DESC').limit(5).to_a 

che restituire un array dei primi 5 messaggi, ordinati per created_at in ordine decrescente.

+0

Non sai cosa stai proponendo nella seconda riga, ma non funziona affatto. – nathanvda

+0

Siamo spiacenti, grazie a mliebelt per aver corretto l'errore di sintassi. – bluehallu

+4

Se uso to_a direttamente sulla classe, ottengo l'errore: 'metodo non definito' to_a 'per # 'in Rails 4. – Douglas

2

modo nidificato

Post.order('created_at DESC').limit(5).to_a 
+0

Grazie a tutti per l'aiuto :) –

+0

@ MateuszUrbański quindi, se hai già avuto la tua risposta, dammi un po 'd'amore e segna la risposta scelta come corretta –

Problemi correlati