tutorial rails que ejemplos descargar curso caracteristicas ruby-on-rails ruby ruby-on-rails-3 activerecord

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