Find si error

Buenos dias.

como hago para realizar una consulta en un modelo que cuando no
encuentre el rregistro no me genere error?

no me digan que le ponga rescue, por que eso no es lo que necesito.

modelo = Modelo.find_by_id(1)

if modelo.valor = algo
ccccc
hago otras cosas con el modelo
else
fhshsf
end

como lo tengo voy dos veces a la base de datos.
una para chequear si existe el registro
y otra para cargar el modelo, esto me parece demà s.

entonces como cargo de una el modelo y que no me genere error si no
existe?

mil gracias

On 7/1/07, wifer [email protected] wrote:

Buenos dias.

como hago para realizar una consulta en un modelo que cuando no
encuentre el rregistro no me genere error?

no me digan que le ponga rescue, por que eso no es lo que necesito.

Asi es la funcion, no devuelve nil, devuelve una excepcion. Y porque
decis que no es lo que necesitas?

como lo tengo voy dos veces a la base de datos.
una para chequear si existe el registro
y otra para cargar el modelo, esto me parece demàs.

Cuando vas 2 veces? Si con el find ya traes los datos -primera vez- y
despues no deberia volver a ir, al menos que ese “algo” q pusiste vos
sea una relacion y en ese caso si iria. Para evitar esa ida haces:

modelo = Modelo.find_by_id(1, :include => :algo )

entonces como cargo de una el modelo y que no me genere error si no
existe?

Excepcion te la va a dar el metodo de buscar una, haces un rescue y
rescatas el la excepcion, para eso esta rescue, no veo porque tu
negacion a usarlo.

Me parece que confundis error con excepcion.

Saludos!

Pero rescue no me interrumpe la ejecucion de la aplicacion? o puedo en
el rescue evaluar otras cosas y hacer otras cosas? que siga.

Necesito es que si carga el modelo haga algo con esos datos, si no lo
carga hace otras opraciones con otros modelos. Esto se puede con
rescue?

mil Gracias Emilio.

Aparte de lo dicho, si quieres que te siga ejecutando el código, pon el
tratamiento de la excepción sólo encapsulando el find:

… cosas…
begin
a = Modelo.find (id)

se carga el modelo, por lo que haces algo con esos datos

rescue
#no se carga el modelo, por lo que hace cosas con otros modelos
end
… continua haciendo cosas

On 7/3/07, William B. [email protected] wrote:

Pero rescue no me interrumpe la ejecucion de la aplicacion?

Si,la interrumpte y va a la seccion donde vas a tratar esa excepcion.

o puedo en
el rescue evaluar otras cosas y hacer otras cosas? que siga.

Necesito es que si carga el modelo haga algo con esos datos, si no lo
carga hace otras opraciones con otros modelos. Esto se puede con
rescue?

Claro! En rescue puede ir cualquier codigo! Te recomiendo que leas:

http://www.rubycentral.com/book/tut_exceptions.html

Llendo a Rails, al no encontrar el elemento vas a tener una excepcion
de ActiveRecord. La cual vas a poder manejar, eso implica cualquier
codigo de recuperacion (q tambien podria tirar otra excepcion).

Recorda tambien que si buscas un elemento especifico de AR y no existe
te va a dar una excepcion y si buscas un conjunto de elementos
(User.find :all), no te va a tirar una excepcion sino un array vacio [
].

Saludos!

Luis V. wrote:

Aparte de lo dicho, si quieres que te siga ejecutando el código, pon el
tratamiento de la excepción sólo encapsulando el find:

… cosas…
begin
a = Modelo.find (id)

se carga el modelo, por lo que haces algo con esos datos

rescue
#no se carga el modelo, por lo que hace cosas con otros modelos
end
… continua haciendo cosas

Mil gracias, anoche optimize los controller, quitando los model.exists
innecesarios que tenia, solo deje los Model.find(id) con rescue.

cada dia me convence más ruby on rails.

Gracias a quienes nos ayudan en este foro he podido aprender mucho y se
que es mucho lo que me falta aun por aprender.

saludos.

Emilio T.
escribió:

Claro! En rescue puede ir cualquier codigo! Te recomiendo que leas:

http://www.rubycentral.com/book/tut_exceptions.html

Llendo a Rails, al no encontrar el elemento vas a tener una excepcion
de ActiveRecord. La cual vas a poder manejar, eso implica cualquier
codigo de recuperacion (q tambien podria tirar otra excepcion).

Yo una vez tuve que usar el rescue, pero sólo me dejó si busco por el
id, entonces si lanza la
excepción:def ver_proyecto
begin
@proyecto=Proyecto.find(params[:id])
rescue ActiveRecord::RecordNotFound
logger.error(“Se ha intentado acceder a un proyecto no
valido #{params[:id]}”)

else

end
end

Recorda tambien que si buscas un elemento especifico de AR y no existe
te va a dar una excepcion y si buscas un conjunto de elementos
(User.find :all), no te va a tirar una excepcion sino un array vacio [
].

En cambio si busco por otro campo, el rescue lo ignoraba y tuve que
hacer algo así, no se si es que lo hacía mal con rescue:
def ver
permalink=params[:permalink]
@pagina = Pagina.find_by_permalink(permalink)
if !@pagina
logger.error(“Se ha intentado acceder a una pagina no
valida #{params[:permalink]}”)

else

end
end

 def update
    @movimiento = Movimiento.find(:first, :conditions => [ "placa = 

? and tipo = ?", plc, 1])
begin
if @movimiento.tipo = 1
# instrucciones
else
# otras # instrucciones
end
end
rescue

      redirect_to :action => "msj_error", :mensaje => @msj

end
end

Emilio, por si te sirve, así lo hice yo y me funciona.

saludos