Hola a todos. Mi pregunta es la siguiente:
Si tengo una transacción
A.transaction do
…
b.save!
a=A.new
a.b_id=b.id
a.save!
end
Obviando el hecho de que puedo anidar la composición de objetos dentro
de un
if
¿Hay alguna forma de que al capturar la excepción de save! por error de
validación pueda mostrar cuales fueron los errores para mostrarlos? Se
que
puedo hacer esto:
…
rescue ActiveRecord::RecordInvalid => invalid
errors=invalid.record.errors #capturo los errores
end
pero ¿como hago para propagar esos errores como se hace normalmente en
un
formulario?
un saludo y gracias.
On Thu, Jun 19, 2008 at 7:44 PM, Rafa C. [email protected] wrote:
Hola a todos. Mi pregunta es la siguiente:
Si tengo una transacción
A.transaction do
…
b.save!
a=A.new
a.b_id=b.id
a.save!
Si B has_many :aes eso se escribiria asi:
b.aes.build
b.save!
Eso es todo, no hay bloque transaccion, si bien todo sucede en una
transaccion dentro de save!.
Por otro lado, para validar los hijos al grabar el padre pondrias
class B
has_many :aes
validates_associated :aes
end
para que pete el save! si falla la validacion de la a que as asociado.
En general en AR hay que trabajar desde el padre de la relacion y
tirando de la API que los has_many and friends ofrecen, si te ves
usando un ID suelto tate! Salvo que lo hagas a proposito por algun
tema, lo normal es no ver ninguno y trabajar siempre a nivel de
modelos.
¿entonces .build llama a los validadores? supongo que dejará un flag que
le
indique a save! que no debe volver a validar nada.
Lo que supono que me dices es que en lugar de
a.b_id=b.id
…
haga directamente
b.add(a1)
b.add(a2)
…
b.save (o b.aes.build;b.save!)
¿esto guardarÃa b y los a nuevos o modificados?
El dÃa 19 de junio de 2008 20:03, Xavier N. [email protected]
escribió:
2008/6/19 Rafa C. [email protected]:
¿entonces .build llama a los validadores?
Nope, validates_associated se ejecuta cuando el resto de validaciones,
en b.save!.
b.save (o b.aes.build;b.save!)
¿esto guardarÃa b y los a nuevos o modificados?
Esa es la idea.
Para terminar de ponerlo en claro entonces:
debo poner
has_many …
validates_associated …
def guardar
…
b=… #new o find
… # generamos aes, sin usar a.save
for a in aes
b.add(a)
end
b.save
end
y el b.save recopila todos los errores de validación existentes y tiene
su
propia transacción.
Despues si creo otros aes
a.b=b
b.save
esto no actualizarÃa b, solo a con su b_id
El dÃa 19 de junio de 2008 21:47, Xavier N. [email protected]
escribió:
2008/6/19 Xavier N. [email protected]:
b << a
b.aes << a
2008/6/19 Rafa C. [email protected]:
b=… #new o find
… # generamos aes, sin usar a.save
for a in aes
b.add(a)
b << a
end
O bien b.aes.(build|create) directamente en lugar de crear aes
silvestres.
a.b=b
b.save
esto no actualizarÃa b, solo a con su b_id
Eso es, AR esta pensado para ir de padres a hijos como pauta general.
ok
debo crear hijos “silvestres” porque tengo que pasarles otro dato
Perfecto, muchas gracias
2008/6/19 Xavier N. [email protected]:
2008/6/19 Rafa C. [email protected]:
ok
debo crear hijos “silvestres” porque tengo que pasarles otro dato
hijo = padre.hijos.build(params[:hijo])
hijo.parametro_protected = tal_cosa
padre.save
Has de mirarte un poco la API de AR.