Estoy usando Rails 2.3.5 y en eso si doy Model.find(1)
y si 1 no está en la base de datos, devuelve un error de ActiveRecord. ¿Debería devolver nil
como en el caso de Model.find_by_column('..')
?Rails 2: Model.find (1) da error ActiveRecord cuando no existe id 1
Respuesta
Este es el comportamiento esperado. Creo que David lo explica mejor, así que aquí hay una cita de Ruby, S., Thomas, D. & Hansson, D.H., 2009. Agile Web Development with Rails, Tercera Edición Tercera Edición., Pragmatic Bookshelf (p.330).
Cuando se utiliza un buscador impulsado por claves primarias, que está buscando un registro en particular . Espera que exista . Una llamada a Person.find (5) es según nuestro conocimiento de la tabla de personas. Queremos la fila con una identificación de 5. Si esta llamada no es exitosa -si el registro con la identificación de 5 ha sido destruido-estamos en una situación excepcional . Esto obliga a aumentar de una excepción, por lo que Rails aumenta RecordNotFound.
Por otro lado, los buscadores que usan criterios para buscar están buscando una coincidencia. Por lo tanto, Person.find (: first, : conditions => "name = 'Dave'") es el equivalente de decirle a la base de datos (como una casilla negra) "Dame la primera persona fila que tiene el nombre Dave. "Este exhibe un enfoque claramente diferente para la recuperación; no estamos seguros por adelantado de que obtendremos un resultado. Es completamente posible que el conjunto de resultados esté vacío. Por lo tanto, devuelve nil en el caso de los buscadores que buscan una fila y una matriz vacía para los buscadores que buscan muchas filas es la respuesta natural, no excepcional.
lo explica mejor .. – rubyprince
Si desea que la excepción sea lanzada en find_by_attributes sabores de los métodos de búsqueda, puede utilizar la explosión! versión del método. Por ejemplo, Model.find_by_category! (A_category_value) arrojará RecordNotFound si no se encuentra ninguna coincidencia. Encontré esto como DRY en escenarios como los controladores RESTful, donde tengo un controlador de error común para la excepción y quiero que mis acciones se comporten de manera consistente cuando no se encuentra un recurso que coincida con los parámetros especificados. –
La confusión sobre esto se repite con todos los que vienen a Rails y obtienen una excepción. La confusión/sorpresa se debe a que 'find' es un verbo suave, y no establece explícitamente la precisión o el conocimiento previo de la existencia. Por supuesto, ahora tenemos la decisión, pero es una pregunta que se formulará siempre que nuevas personas comiencen a usar Rails. – ocodo
arrojar la excepción es el comportamiento esperado.
De hecho, en el curso normal de los eventos, si deja que la excepción no se controle, el servidor de los raíles devolverá el error 404 página no encontrada correcta.
si lo desea para que vuelva a cero se puede tomar por sí mismo:
begin
@model = Model.find(id_provided)
rescue ActiveRecord::RecordNotFound => e
@model = nil
end
Thanks..I también encontró el error y me encontré es molesto ... Podemos usar 'Model.find_by_id (1)' pero lo encuentro torpe. – rubyprince
Puede verificar si el registro existe antes de ir a buscarlo.
@model = Model.find(id) if Model.exists?(id)
esto se resolverá en 2 consultas que no es ideal. – VelLes
Si realmente no quiere la excepción, puede utilizar find_by_id
:
# @user = User.find(params[:id]) # original code
@user = User.find_by_id(params[:id])
if @user
# found!
else
# not found
end
Esto debería ser más rápido que un cheque por separado exists?
.
EDITAR: Tenga en cuenta que, como comentó @Miguelgraz, en Rails 4 debería decir User.find_by(id: params[:id])
. La misma funcionalidad, pero ahora la implementación no necesitará method_missing
.
sí ... He mencionado eso en el comentario a la respuesta de Kalendae ... – rubyprince
Esto está obsoleto en los rieles 4, consulte esta otra respuesta http://stackoverflow.com/a/26885027/645223 – Miguelgraz
Si desea que se arroje la excepción en find_by_attributes sabores de los métodos del buscador, puede usar el bang! versión del método.
Por ejemplo,
Model.find_by_category!(a_category_value)
arrojará RecordNotFound si no se encuentra ninguna coincidencia.
Encontré esto como DRY en escenarios como los controladores RESTful, donde tengo un controlador de error común para la excepción y quiero que mis acciones se comporten de manera consistente cuando no se encuentra un recurso que coincida con los parámetros dados.
Carriles 4 Método
if user = User.find_by(id: params[:id])
#do something with user
else
#throw error or redirect
raise ActiveRecord::RecordNotFound
end
Puede utilizar find_by con el atributo requerido (en su caso el id) esto devolverá nil en lugar de dar un error si no se encuentra el identificador dado.
Model.find_by_id(id_value)
También es posible usar donde pero hay que saber que en relación devolver un registro activo con cero o más registros es necesario utilizar primero para devolver sólo un registro o nula en caso de retorno a cero registros.
Model.where(id: id_value).first
Usted puede simplemente utilizar:
user = User.find(10) rescue nil
- 1. 1 + 1/2 + 1/3 + --- + 1/n =?
- 2. pitón: función toma exactamente 1 argumento (2 da)
- 3. En Javascript, ¿por qué {a: 1} == {a: 1} da un error, y ({a: 1}) == {a: 1} funcionará?
- 4. En Javascript, ¿por qué [1, 2] == [1, 2] o ({a: 1}) == ({a: 1}) es falso?
- 5. "SELECCIONAR SUPERIOR 1 1" VS "SI EXISTE (SELECCIONAR 1"
- 6. Regex $ 1, $ 2, etc.
- 7. ¿Hay una sintaxis más limpia para WHERE id! = 1 AND id! = 2 AND id! = 7
- 8. SELECCIONAR 1 = 1 no funciona
- 9. Selenium 1 vs 2
- 10. Haskell: Equation Expander 1+ (1+ (1+ (1+ (...)))) = ∞
- 11. ¿Cuál es la prueba de (N-1) + (N-2) + (N-3) + ... + 1 = N * (N-1)/2
- 12. make: *** [] Error 1 Error
- 13. android.os.StrictMode instances = 2; limit = 1
- 14. Seleccione * de la tabla 1 que no existe en la tabla 2 con condicional
- 15. ¿Por qué en Ruby, a || 1 lanzará un error cuando `a` no está definido, pero a = a || 1 no?
- 16. wix 3.6 ComponentGroupRef Id = "Product.Generated" da error, wix 3.5 no
- 17. 1. Error # QNAN C++
- 18. ERROR "Datos adicionales: línea 2 columna 1" cuando se utiliza pycurl con corriente gzip
- 19. Ajustar la columna MySQL ID 1
- 20. Rails 3, ActiveRecord, PostgreSQL - ¿El comando ".uniq" no funciona?
- 21. 1.week.ago.in_zone (Time.zone) para Rails?
- 22. 2 Seleccione o 1 consulta de unión?
- 23. Rails SQL COUNT N + 1 ineficiencia
- 24. ActiveRecord Find All no ordena por ID?
- 25. En C++, ¿qué es más rápido? (2 * i + 1) o (i << 1 | 1)?
- 26. ASP.NET error de análisis XML: se encontró ningún elemento Número de línea 1, columna 1 Error
- 27. ¿Por qué -1 >> 1 es -1? ¡Y 1 >> 1 es 0!
- 28. Ruby on Rails: ¿Cómo hacer que ActiveRecord muestre la próxima identificación (última + 1)?
- 29. C++ - 2 clases de 1 archivos
- 30. Volver primero desde 1, 2 de 2, ..., 11 de 11,
Por unos raíles 4 respuesta por favor ver http://stackoverflow.com/a/26885027/645223 – Miguelgraz