2012-03-08 11 views
8

Cuando llamo a un find con un id, se convierte en un find específico y arroja un error RecordNotFound.Cómo emitir un 'hallazgo' o 'dónde' que genera un RecordNotFound

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

Pero cuando llamo a que, con condiciones, consigo nula si no se encuentra:

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

quiero tal búsqueda condicional para elevar un error también. Sé que puedo hacer:

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

Pero eso tiene condiciones sólo muy simples. El mío necesita un poco más de complejidad; en realidad algo así como:

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

Y, si no se encuentra nada, quiero que levante el error RecordNotFound. ¿Es eso posible? ¿O debería simplemente agregar algún código para verificar contra nil? y si es nulo? elevar el error yo mismo? Y si es así, ¿cómo hago eso en Rails 3?

Respuesta

3

Su último párrafo es lo que necesita hacer. Ya sea contra cero, o levante las excepciones usted mismo. Para elevar la excepción ti mismo, hacer lo siguiente:

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

En el último fragmento de código en realidad se está obteniendo los registros de todos los DB y luego haciendo select en una matriz de Ruby. No tiene nada que ver con ActiveRecord, por lo que puede hacer lo que quiera para subir la excepción manualmente, ya sea utilizando el código sugerido por Douglas o if, o unless, etc. Pero parece que no comprende exactamente qué hace su código. Su select {...} no está traducido a SQL SELECT ... WHERE(...).

Si necesita una excepción levantada automáticamente por ActiveRecord consulta, utilice la siguiente:!

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

La explosión equivalente existen métodos para métodos find_by así, por ejemplo Foo::Bar.find_by_name!(name)

+3

nunca supo de la 'primera' método, gracias por mencionarlo. – bricker

+0

@lulalala Gracias por extender mi respuesta. No me importó mencionar los métodos 'find_by' porque el autor de la pregunta explícitamente dice que los conoce y la pregunta no es exactamente sobre esto. – RocketR

+0

@RocketR Me acabo de dar cuenta en el mencionado en cuestión ahora. Creo que me estaba enfocando en el título de la pregunta. – lulalala

Cuestiones relacionadas