Pregunta find () con nil cuando no hay registros


En mi programa actual de rieles cuando uso algo como

 user = User.find(10)

Cuando no hay ningún usuario con ID = 10, tendré excepciones como:

ActiveRecord::RecordNotFound: Couldn't find User with ID=10

¿Puedo obtener nil en lugar de aumentar la excepción así que cuando hago algo como:

unless user = Challenge.find(10)
  puts "some error msg"         
end

Solo quiero ponerme nulo cuando no haya registros y no quiero usar comenzar / rescatar

Gracias


73
2018-03-07 15:46


origen


Respuestas:


Sí, solo hazlo:

Challenge.find_by_id(10)

Para Rails 4 y 5:

Challenge.find_by(id: 10)

131
2018-03-07 15:47



En Rails 4, buscadores dinámicos, como find_by_id que se usó en la respuesta aceptada - se desaprobaron.

En el futuro, debe usar la nueva sintaxis:

Challenge.find_by id: 10

25
2017-11-12 10:45



puede hacer esto un poco hackish, solo use la Interfaz de Consulta ActiveRecord.

esto devolverá cero, en lugar de generar una excepción

  User.where(:id => 10).first

13
2018-03-07 15:49



Puedes intentar esto Challenge.exists?(10)


4
2018-03-07 15:48



¿Por qué simplemente no captas la excepción? Su caso se ve exactamente como las excepciones que se hicieron para:

begin
  user = User.find(10)
rescue ActiveRecord::RecordNotFound
  puts "some error msg"
end

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 "rescatar".


4
2018-01-31 15:10



Para aquellos que luchan con mongoide, resulta que ambos find y find_by los métodos aumentarán la excepción, ¡sin importar la versión de su riel!

Hay un opción (a saber raise_not_found_error) que se puede configurar como falso, pero cuando falsey hace find el método no genera excepciones también.

Por lo tanto, la solución para usuarios monógamos es el código desagradable:

User.where(id: 'your_id').first # argghhh

3
2017-11-01 20:06



tan simple como:

user = User.find(10) rescue nil

2
2017-12-19 11:48



Puede usar find_by con el atributo requerido (en su caso, el id) esto dará como resultado cero en lugar de dar un error si no se encuentra el id.

user = Challenge.find_by_id(id_value)

o puede usar el nuevo formato:

user = Challenge.find_by id: id_value

También puede usar where, pero debe saber que donde devuelve una relación de registro activa con cero o más registros que necesita usar primero para devolver solo un registro o nulo en caso de que regresen cero registros.

user = Challenge.where(id: id_value).first

0
2017-10-04 09:06