2015-09-26 11 views
5

Czy metoda Rails find jest przestarzała?Czy Railsy są przestarzałe?

W dawnych czasach preferowanym sposobem wyszukiwania według id był find(1).

Czy lepiej używać find_by(id:1) zamiast find(1)?

+8

'find' jest pierwszą metodą wymienioną w ActiveRecord [Przewodnik po Railsach] (http://guides.rubyonrails.org/active_record_querying.html#retrieving-a-single-object), więc myślę, że można bezpiecznie powiedzieć to wciąż droga. –

+3

Czy widzisz przestarzałe w RubyMine? Jeśli tak, to jest znany i zgłoszony błąd: https://youtrack.jetbrains.com/issue/RUBY-17979 –

Odpowiedz

4

Ani metoda jest przestarzałe (o ile wiem). Różnica między find i find_by() jest tym, co zwracają, gdy rekord nie istnieje. Jeśli rekord z ID 23 nie istnieje, to jest to, co masz:

Model.find(23) 
=> ActiveRecord::RecordNotFound: Couldn't find Model with 'id'=23 

Albo

Model.find_by(id: 23) 
=> nil 

Korzystanie find_by jest bardziej wyrozumiały jeśli robisz kwerend gdzie nieistniejący rekord jest możliwe, ponieważ otrzymujesz wartość nil zamiast wyjątku.

0

Począwszy od Rails 4.2.1, nie jest. Here to dokumentacja API (nie oficjalny, ale całkiem niezły). To, co myślę, że patrzysz, to this method, które zostało wycofane w Rails 3.0.0.

Nigdy nie użyłem metody find_by(). Uważam, że lepsze/nowsze metody użyć, jest metoda where(), tak:

User.where(name: "Bob", email: "[email protected]") 
+1

'where' is not better/newer, po prostu robi coś innego. A ten przestarzały znaleźć link do wciąż jest w zasadzie ta sama metoda. Po prostu przeniósł się z 'Base' na' FinderMethods'. – Mischa

+3

'find_by (x)' może być uważane za równoważne 'where (x) .first'. –

+0

.where() zwraca tablicę obiektów, podczas gdy .find_by() zwraca instancję obiektu. –

1

Pewnie masz na myśli Wycofanie ActiveRecord::Base#find jak: znalezienia (pierwszy) i find (: all) które zastąpiona pierwszych i wszystkich metod.

Obsługa tej metody została usunięta z szyn 3.2.

Metoda, której użyłeś (ActiveRecord::FinderMethods#find) nie jest przestarzała.

+1

FWIW, myślę, że zamieszanie jest z metodami 'find_by_xxx'. Myślę, że były one przestarzałe w Railsach 4. –

Powiązane problemy