Szyny.where vs. find
Zauważyłem, że metoda Model.where
zawsze zwraca tablicę, nawet jeśli istnieje tylko jeden wynik, gdzie metoda Model.find
nie. Czy Jest jakiś powód? Myślałem, że Model.where
jest preferowaną funkcją od Rails 3.X.
Czy powinienem używać Model.find
, gdy oczekuję pojedynczego wyniku i Model.where
, gdy oczekuję więcej niż jednego wyniku?
3 answers
where
zwracaActiveRecord::Relation
(nie jest tablicą, chociaż zachowuje się podobnie), która jest zbiorem obiektów modelu. Jeśli nic nie odpowiada warunkom, po prostu zwraca pustą relację.-
find
(i powiązane z nim dynamiczne metodyfind_by_columnname
) zwraca pojedynczy obiekt modelu . Jeśli nic nie zostanie znalezione,ActiveRecord::RecordNotFound
wyjątek jest podnoszony (ale nie z dynamicznymi metodamifind_by_
).While
find
może zwracać tablicę rekordów-nie relację-jeśli podano listę ID, użyciewhere
jest preferowane od Rails 3. Wiele podobnych zastosowańfind
jest obecnie przestarzałych lub całkowicie znikniętych .
Więc tak, jeśli chcesz i oczekujesz tylko jednego obiektu, użycie find
jest łatwiejsze, ponieważ w przeciwnym razie musisz wywołać Model.where.first
.
Zauważ, że stare opcje skrótu find
i wiele dynamicznych metod find_
są przestarzałe od Rails 4.0 (zobacz odpowiednie uwagi do wydania ).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 22:11:30
Faktycznie find_by
pobiera obiekt modelu z where
uzyskanego ActiveRecord::Relation
def find_by(*args)
where(*args).take
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-25 09:41:04
Model.find
używa kolumny klucza głównego. Dlatego zawsze jest dokładnie jeden lub żaden wynik. Użyj go, gdy szukasz konkretnego elementu identyfikowanego przez jego id.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 22:01:38