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?

Author: AdamB, 2012-03-06

3 answers

  • where zwraca ActiveRecord::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 metody find_by_columnname) zwraca pojedynczy obiekt modelu . Jeśli nic nie zostanie znalezione,ActiveRecord::RecordNotFound wyjątek jest podnoszony (ale nie z dynamicznymi metodami find_by_).

    While find może zwracać tablicę rekordów-nie relację-jeśli podano listę ID, użycie where 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 ).

 113
Author: Andrew Marshall,
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

Źródło

 12
Author: Kamil Lelonek,
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.

 6
Author: iltempo,
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