2013-03-03 13 views

Odpowiedz

49

Różnica polega na tym, co zwracają po znalezieniu rekordu lub gdy go nie znaleziono. Rozważ następujące przykłady:

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

Jak widać, istniejącego użytkownika można pobrać za pomocą dowolnej z 3 metod. Duża różnica z użyciem where to można komendy łańcuchowe (oczywiście, bez poddawania first pierwszy.)

Rzućmy okiem na kiedy starał się znaleźć zapis, który nie jest istniejącą

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

So tutaj, jest oczywiste, że gdy używasz find do wyszukiwania rekordu, który nie istnieje, otrzymujesz wyjątek. Ten wyjątek to ActiveRecord::RecordNotFound, który renderuje 404 w środowisku produkcyjnym.

Mam nadzieję, że to pomoże!

UPDATE

szyny 4 ma następującą składnię dla 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

Należy pamiętać, że wszystkie '*' find_by_ metody deprecrated w szynach 4 na korzyść 'find_by (* ...)' więc o to byłoby być: 'find_by (id: ...) ' – pjam

+3

wow Nie wiedziałem tego. dzięki! dlaczego tego tu nie ma? http://edgeguides.rubyonrails.org/4_0_release_notes.html – jvnill

1

find => ten jest stosowany, aby znaleźć wiersz po id. To zwróci pojedynczy rekord.

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

find_by => służy do zdobycia rzędów przez dowolne cechy rekordu. Spowoduje to zwrócenie pierwszego pasującego rekordu, jeśli warunek zostanie spełniony.

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

where => to stosuje się aktywne rejestry oparte na warunkach powrotu aktywnego związku wpisu (tj), może być zero lub więcej wpisów.

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

znaleźć => Powrót ten pojedynczy rekord czy dany primary_key (ID) w systemie istnieje poza tym daje błąd.

Model.find(required_id_value) 

find_by => To zwróci pojedynczy rekord zależy od danego atrybutu, a jeżeli wartość atrybutu nie istnieje w DB zwróci nil.

Model.find_by_name("your name") 

nazwa tutaj jest atrybutem i musi istnieć w swoim modalu.

gdzie => To zwróci Active Record relację z zera lub więcej zapisów, które trzeba użyć najpierw powrócić tylko jeden rekord lub zerowa w przypadku zerowej rekordy zamian.

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

** Record.find (0) ** podnosi "ActiveRecord :: RecordNotFound: Nie można znaleźć Record with 'id' = 0'' ** Record.find_by (id: 0) ** zwraca 'nil' Record.find_by_id (0) również zwraca zero, mimo że jest przestarzałe w późniejszych wersjach szyn. ** Record.where (id: 0) ** zwraca pustą tablicę – Hanmaslah

Powiązane problemy