Forum: Rails-ES Validar insercion de multiples registros

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
A9798ef15addcb1578aa0906788d2e92?d=identicon&s=25 Ruben Davila (rub3n)
on 2007-04-03 23:21
(Received via mailing list)
Saludos amigos, actualmente tengo un esquema algo complicado con mis
modelos y necesitaba manejar todos desde un mismo formulario, me
explico:
- Un producto tiene muchos tamaños:
class Producto < AR...
 has_many :tamanos
end
- Un tamano pertenece a un producto y ademas tiene muchos campos:
class Tamano < AR...
 belongs_to :producto
 has_many :campos
end
- Un campo pertenece a un tamano
class Campo
 belongs_to :tamano
end

Bueno mis modelos andan algo asi, he logrado que se pueden insertar "n"
tamaños y a la vez "n" campos para cada tamaño:

def create
 @producto = Producto.new(params[:producto])
 if @producto.valid?
  campos=params[:campos].values
  params[:tamanos].each {|kt,vt|
   @tamano=@producto.tamanos.create(vt)
   campos_tamano=campos.select{|v| v[:t_key]==kt}
   @tamano.campos.create(campos_tamano) if campos_tamano.size >= 1
  }
 end
end

Bueno basicamente he trabajado con indices en los campos del formulario,
me guie de aqui: http://railsforum.com/viewtopic.php?id=1065 , todo esta
bien, pero al momento de hacer los insert solo estoy validando el
producto mas no los demas objetos como Tamano y Campo, es logico que las
validaciones van en los modelos, pero si me llegaria a fallar una
entonces solamente se grabarian algunos registros lo cual no es la idea,
ojala alguien  me pueda ayudar con una manera elegante de realizar esa
validacion.

Muchas gracias.
Ruben.
Afe765ee2d37bd6ad7e55d6f5fd35f1e?d=identicon&s=25 Hernan Fernandez (Guest)
on 2007-04-04 00:43
(Received via mailing list)
Rube,
no tengo para probarlo ahora pero algo como esto debería funcionar:
usa create! para que se genere una excepción al crear los campos nuevos
y
todo dentro de una transacción, en el caso de que se produzca un error
se
hace un rollback automático y nada se crea

def create
  Producto.transaction do
   .. tu código
  end
end

Debes usar una base de datos que soporte transacciones, InnoDB si usas
MySQL.
El problema con esto es saber donde se produce el error en el caso de
que
exista uno e informarlo de manera adecuada...

Espero sirva el dato.
cuanta como te fué

Saludos
Hernán Fernandez
This topic is locked and can not be replied to.