En mi programa de rieles actual cuando uso algo como
user = User.find(10)
Cuando no haya un usuario con ID = 10, tendré una excepción como:
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
¿Puedo obtener nulo en lugar de generar una excepción cuando hago algo como:
unless user = Challenge.find(10)
puts "some error msg"
end
Solo quiero obtener cero cuando no hay registros y no quiero usar begin / rescue
Gracias
Respuestas:
Sí, solo haz:
Para rieles 4 y 5:
fuente
.find_by_*
devolvería cero y.find
no.Something.find_by(id: x)
, se crea una declaración SQL con todos los pares de atributo / valor del hash como parte de la cláusula WHERE. Me parece un error de Rails.find_by_...
buscadores dinámicos para cada atributo que tiene un modelo incluido:id
. Por lo tanto,Challenge.find_by_id(10)
debería funcionar independientemente de la versión de Rails.Challenge.find(10) rescue nil
En Rails 4, los buscadores dinámicos, como el
find_by_id
que se usó en la respuesta aceptada, quedaron obsoletos.En el futuro, debe usar la nueva sintaxis:
fuente
Challenge.find_by(id: 10)
es la otra forma de escribir estopuede hacer esto un poco pirateado, simplemente use la interfaz de consulta ActiveRecord.
esto devolverá nil, en lugar de generar una excepción
fuente
find_by_id
es que es portátil de Rails 3 a 4. En Rails 4, lo esfind_by(:id => 10)
.¿Por qué no capta simplemente la excepción? Su caso se ve exactamente como se hicieron las excepciones:
Si desea recuperarse del error en el bloque de rescate (por ejemplo, estableciendo un usuario de marcador de posición (patrón nulo)), puede continuar con su código debajo de este bloque. De lo contrario, puede poner todo su código para el "caso feliz" en el bloque entre "comenzar" y "rescate".
fuente
begin…end
bloque, si ya tiene un bloque como un método de controlador. En ese caso, la única línea adicional que necesita es larescue
línea. Mucho más elegante y más fácil de manejar que comprobarnil
con unaif
declaración.Puedes probar esto
Challenge.exists?(10)
fuente
Para aquellos que luchan con mongoid , resulta que ambos métodos
find
yfind_by
generarán una excepción, ¡sin importar su versión de rieles!Hay una opción (a saber, raise_not_found_error ) que se puede establecer en falso, pero cuando falsey hace que el
find
método no genere una excepción también.Por lo tanto, la solución para los usuarios de mongoides es el código repugnante:
fuente
.where(email: params[:email]).first
Me parece más elegante que a mí.rescue
sintaxis, ya que puede ocultar problemas como errores tipográficostan simple como:
fuente
if user...else
Puede usar 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 id dado.
o puede usar el nuevo formato:
También puede usar where, pero debe saber que where devuelve una relación de registro activa con cero o más registros que debe usar primero para devolver solo un registro o nulo en caso de que regresen cero registros.
fuente