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.findno.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 nilEn Rails 4, los buscadores dinámicos, como el
find_by_idque 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_ides 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…endbloque, si ya tiene un bloque como un método de controlador. En ese caso, la única línea adicional que necesita es larescuelínea. Mucho más elegante y más fácil de manejar que comprobarnilcon unaifdeclaración.Puedes probar esto
Challenge.exists?(10)fuente
Para aquellos que luchan con mongoid , resulta que ambos métodos
findyfind_bygenerará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
findmé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]).firstMe parece más elegante que a mí.rescuesintaxis, ya que puede ocultar problemas como errores tipográficostan simple como:
fuente
if user...elsePuede 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