Validar insercion de multiples registros


#1

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.


#2

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