2013-03-03 4 views

Antwort

49

Der Unterschied ist, was sie zurückgeben, wenn ein Datensatz gefunden wird oder wenn er nicht gefunden wird. Betrachten Sie die folgenden Beispiele:

>> 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 

Wie Sie sehen können, eine bestehende Benutzer mit einer der drei Methoden abgerufen werden können. Der große Unterschied mit where Verwendung ist, können Sie Kettenbefehle (natürlich ohne first ersten Aufruf.)

einen Blick Lassen Sie haben an, wenn Sie versuchen, einen Datensatz zu finden, der nicht bestehenden

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

So Hier ist es offensichtlich, dass Sie eine Ausnahme erhalten, wenn Sie find verwenden, um nach einem Datensatz zu suchen, der nicht vorhanden ist. Diese Ausnahme ist ActiveRecord::RecordNotFound, die eine 404 in der Produktionsumgebung rendert.

Hoffe, das hilft!

UPDATE

Schienen 4 verwendet die folgende Syntax für 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

Sie sollten beachten, dass 'find_by_ *' Methoden in Schienen 4 für 'find_by deprecrated sind' find_by (id:: (*: ...) 'hier so sein, dass wäre ...) ' – pjam

+3

wow, ich wusste das nicht. Vielen Dank! Warum wird das hier nicht erwähnt? http://edgeguides.rubyonrails.org/4_0_release_notes.html – jvnill

1

find => dies verwendet wird, durch id Zeile zu finden. Dies wird einen einzelnen Datensatz zurückgeben.

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

find_by => diese verwendet wird Zeile mit allen Attributen der Aufzeichnung zu erhalten. Dies liefert den ersten übereinstimmenden Datensatz, wenn die Bedingung übereinstimmt.

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

where => das verwendet wird, erhalten aktive Datensätze basierend auf Bedingungen aktive Datensatz Beziehung zurückzukehren (d) kann null oder mehrere Datensätze sein.

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

findet => Diese Rückkehr einzelner Datensatz, wenn die angegebene primary_key (id) im System vorhanden ist sonst in einem Fehler geben.

Model.find(required_id_value) 

find_by => Dies wird einzelnen Datensatz zurückkehrt, hängt von dem Attribute gegeben, und wenn der Wert des Attributs in der DB ist nicht vorhanden wird es Null zurück.

Model.find_by_name("your name") 

Name hier ist das Attribut und es muss in Ihrem Modal vorhanden sein.

wo => Dies wird eine aktive Datensatzbeziehung mit null oder mehr Datensätze zurückgeben, die Sie zuerst verwenden müssen, um nur einen Datensatz zurückzugeben, oder Null, falls Nulldatensätze zurückgeben.

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

** Record.find (0) ** wirft 'ActiveRecord :: RecordNotFound: Konnte Datensatz mit 'ID' 0 nicht finden ** Record.find_by (id: 0) ** gibt 'nil' zurück Record.find_by_id (0) gibt auch nil zurück, obwohl es in späteren Versionen von rails nicht mehr verwendet wird. ** Record.where (id: 0) ** gibt ein leeres Array zurück – Hanmaslah

Verwandte Themen