2015-07-08 18 views
7

Desidero trovare un record specifico all'interno di un oggetto ActiveRecord::Relation in modo da poter acquisire l'attributo di quel record.Rails Trova un record all'interno di ActiveRecord :: Oggetto di relazione senza interrogare nuovamente il database

Il seguente funziona, ma il problema è che sta colpendo nuovamente il database con quella dichiarazione find_by. Non dovrebbe essere necessario. Ci dovrebbe essere un modo per i binari di trovare quell'oggetto all'interno dell'oggetto ActiveRecord::Relation invece di dover interrogare nuovamente il database.

#returns an ActiveRecord::Relation object 
@blogs = Blog.all 

# Search for the blog within that ActiveRecord::Relation object, NOT the database 
@blogs.find_by(id: 1).title #do this statement but don't hit the database again 

risposta

11

Una volta caricata la versione, è possibile utilizzare metodi di array regolari. find è in realtà metodo molto interessante - se è specificato blocco, sarà delegata al bersaglio relazione:

@blogs.find {|b| b.id == 1} 
8

Quando si chiama find_by, che sta per colpire il database.

L'oggetto relazione viene utilizzato per caricare pigro i risultati del db.

Una volta caricati per la chiamata all, è possibile effettuare la ricerca all'interno della matrice risultante.

Se si desidera esaminare all'interno dei risultati già memorizzati nel processo Ruby, è necessario cercare all'interno dell'array utilizzando find o detect (che fanno la stessa cosa). Io tendo ad usare detect, quindi è chiaro che non è colpire il database:

@blogs.detect { |b| b.id == 1 } 

http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-detect

0

È sempre possibile utilizzare where clausola. Per esempio

@blogs.where(id: 1).first.reload 

Per ottenere (e ricaricare dal database) istanza @blog con ID 1. e tenere a mente che questa query sarà veloce, efficiente e sicuro (nel caso in cui si desidera aggiungere params[:id] invece che dal disco -codificato ID.

Problemi correlati