2013-03-03 12 views

risposta

49

La differenza è ciò che restituiscono quando viene trovato un record o quando non viene trovato. Prendere in considerazione i seguenti esempi:

>> User.create name: 'THE USER' # creates a user with id = 1 
>> User.find(1) # returns the user 
>> User.find_by_id(1) # returns the user 
>> User.where(id: 1).first # returns the user 

Come si può vedere, un utente esistente può essere recuperata utilizzando uno dei 3 metodi. La grande differenza con l'utilizzo di where è comandi a catena (ovviamente, senza chiamare first prima.)

puoi Diamo un'occhiata a quando si tenta di trovare un record che non è esistente

>> User.find(2) # raises an exception 
>> User.find_by_id(2) # nil 
>> User.where(id: 2).first # nil 

Così qui, è ovvio che quando si utilizza find per cercare un record che non esiste, si ottiene un'eccezione. Questa eccezione è ActiveRecord::RecordNotFound che esegue il rendering di un 404 nell'ambiente di produzione.

Spero che questo aiuti!

UPDATE

rotaie 4 utilizza la seguente sintassi per find_by

>> User.find_by(id: 1) # returns nil if there's no user with an id of 1 
>> User.find_by!(id: 1) # raises ActiveRecord::RecordNotFound when no record is found 
+18

Si dovrebbe notare che tutti i '' find_by_ * metodi sono deprecrated in rotaie 4 a favore di 'find_by (*: ...)' ecco che sarebbe BE: 'find_by (id: ...) ' – pjam

+3

wow non lo sapevo. Grazie! perché non è quello menzionato qui? http://edgeguides.rubyonrails.org/4_0_release_notes.html – jvnill

1

find => questo è usato per trovare fila id. Ciò restituirà il singolo record.

YourModel.find(2) 
Address.find(1) 

find_by => questo è usato per ottenere fila eventuali attributi di registrazione. Ciò restituirà il primo record di corrispondenza se la condizione corrisponde.

YourModel.find_by_attrname("value") 
Address.find_by_street_name_and_city("Andheri", "Newyork") 
Addess.find_by_id(4) 

where => questo è usato ottenere record attivi in ​​base alle condizioni per tornare relazione record attivo (cioè) può essere zero o più record.

YourModel.where(:attrname => "something") 
Address.where(:city => "Newyork") 
2

trovare => Questo ritorno singolo record se il primary_key data (id) esiste nel sistema tuttavia in darà un errore.

Model.find(required_id_value) 

find_by => Ciò restituirà singolo record dipende l'attributo dato, e se il valore dell'attributo non è presente nel DB verrà restituito nil.

Model.find_by_name("your name") 

nome qui è l'attributo e deve essere presente nel proprio Modal.

dove => Ciò restituirà una relazione di record attiva con zero o più record che è necessario utilizzare per restituire solo un record o zero nel caso in cui vengano restituiti zero record.

Model.where(id: id_value).first 
+0

** Record.find (0) ** genera ActiveRecord :: RecordNotFound: Impossibile trovare il record con 'id' = 0' ** Record.find_by (id: 0) ** restituisce 'nil' Record.find_by_id (0) restituisce anche nil sebbene sia deprecato nelle versioni successive dei binari. ** Record.where (id: 0) ** restituisce una matrice vuota – Hanmaslah

Problemi correlati