2012-03-08 12 views
8

Quando chiamo un find con un id, esso diventa un find mirato e genera un errore RecordNotFound.Come emettere un 'find' o 'where' che genera un RecordNotFound

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

Ma quando chiamo che con condizioni, ottengo nullo se non trovato:

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

Voglio una ricerca quali condizionale per generare un errore troppo. So che posso fare:

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

Ma questo ha solo condizioni davvero semplici. Il mio ha bisogno di un po 'più di complessità; in realtà qualcosa di simile:

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

E, se non viene trovato nulla, desidero che venga generato l'errore RecordNotFound. È possibile? O dovrei semplicemente aggiungere del codice per verificare contro nil? e se nullo? alzare l'errore me stesso? E se sì, come faccio a farlo in Rails 3?

risposta

3

Il tuo ultimo paragrafo è quello che devi fare. O controlla contro zero o solleva le eccezioni da solo. Per sollevare l'eccezione da soli, effettuare le seguenti operazioni:

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

Nell'ultimo frammento di codice in realtà si sta recuperano tutti i record da DB e poi facendo select su un array di Ruby. Non ha nulla a che fare con ActiveRecord, quindi puoi fare quello che vuoi per sollevare un'eccezione manualmente, o usare il codice suggerito da Douglas, o if, o unless ecc. Ma sembra che tu non capisca cosa fa il tuo codice. Il tuo select {...} non è tradotto in SQL SELECT ... WHERE(...).

Se avete bisogno di un'eccezione sollevata automaticamente dal ActiveRecord ricerca, clicca questo:!

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

Il botto equivalente esistono metodi per i metodi find_by così, ad esempio Foo::Bar.find_by_name!(name)

+3

mai saputo circa la 'prima' metodo, grazie per averlo menzionato. – bricker

+0

@lulalala Grazie per aver esteso la mia risposta. Non mi sono preoccupato di menzionare i metodi 'find_by' perché l'autore della domanda dice esplicitamente che li conosce e la domanda non è abbastanza su questo. – RocketR

+0

@RocketR L'ho appena realizzato in menzionato in questione ora. Immagino di concentrarmi sul titolo della domanda. – lulalala

Problemi correlati