ruby on rails - rails - find() con nil cuando no hay registros
ruby on rails tutorial (8)
¿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".
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
En Rails 4, los buscadores dinámicos, como find_by_id
que se utilizó en la respuesta aceptada, se desaprobaron.
En el futuro, debe usar la nueva sintaxis:
Challenge.find_by id: 10
Para aquellos que luchan con mongoid , resulta que tanto los métodos find
como find_by
generarán excepciones, ¡sin importar la versión de su riel!
Hay una option (es decir, raise_not_found_error ) que se puede establecer en false, pero cuando falsey hace que find
method no genere 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
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
Puedes probar este Challenge.exists?(10)
Existe Challenge.exists?(10)
Sí, solo hazlo:
Challenge.find_by_id(10)
Para Rails 4 y 5:
Challenge.find_by(id: 10)
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
tan simple como:
user = User.find(10) rescue nil