2012-03-08 6 views
8

Kiedy wywołuję znalezisko o identyfikatorze, staje się ono celem znalezienia i spowoduje błąd RecordNotFound.Jak wydać "Znajdź" lub "Gdzie", które wywołuje RecordNotFound

Foo::Bar.find(123) # RecordNotFound if no Bar with id 123 exists. 

Ale gdy zgłoszę, że warunki, mam zero, jeśli nie znaleziono:

Foo::Bar.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) 

chcę takiego wyszukiwania warunkowe podniesienie błąd zbyt. Wiem, że mogę:

Foo::Bar.find_by_name!("CocktailBar") #=> raises Recordnotfount if not not found. 

Ale to ma tylko naprawdę proste warunki. Mój potrzebuje trochę więcej złożoności; w rzeczywistości coś takiego:

Foo.Bar.select{ |pm| pm.name.downcase =~ /cocktail/}.first 

A jeśli nic nie zostanie znalezione, chcę, aby podniósł błąd RecordNotFound. Czy to w ogóle możliwe? Czy powinienem po prostu dodać kod, aby sprawdzić przeciwko zeru? a jeśli zero? sam podnosić błąd? A jeśli tak, jak mam to zrobić w Rails 3?

Odpowiedz

3

Twój ostatni akapit jest tym, co musisz zrobić. Albo sprawdź zero lub sam podnieś wyjątki. Aby podnieść wyjątkiem siebie, wykonaj następujące czynności:

Foo::Bar.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) || raise(ActiveRecord::RecordNotFound) 
41

W ostatnim fragmencie kodu w rzeczywistości ściągam wszystkie rekordy z DB i wtedy robi select na tablicy Ruby. Nie ma to nic wspólnego z ActiveRecord, więc możesz zrobić, co chcesz, aby podnieść wyjątek ręcznie, albo użyj kodu sugerowanego przez Douglasa, albo if lub unless itd. Wygląda jednak na to, że nie bardzo rozumiesz, co robi twój kod. Twoja select {...} nie jest tłumaczona na SQL SELECT ... WHERE(...).

Jeśli potrzebujesz wyjątek podniesiony automatycznie przez ActiveRecord zapytania, użyj tego:

Foo::Bar.where([ "lower(name) = ?", name.downcase ]).first! 

Równowartość huk metody istnieją metody find_by jak również, na przykład Foo::Bar.find_by_name!(name)

+3

Nigdy nie wiedział o 'pierwszy' metoda, dzięki za wzmiankę o tym. – bricker

+0

@lulalala Dzięki za przedłużenie mojej odpowiedzi. Nie chciałem wspominać o metodach 'find_by', ponieważ autor pytania wyraźnie mówi, że je zna, a pytanie nie dotyczy tego. – RocketR

+0

@RocketR Właśnie zdałem sobie sprawę z tego we wspomnianym już pytaniu. Sądzę, że skupiałem się na tytule pytania. – lulalala

Powiązane problemy