Problema con save

Hola de nuevo,
Tengo el mismo código en dos proyectos distintos (el primero era de
prueba) y en uno me funciona y en otro no. Aparentemente no tengo
diferencias, digo aparentemente porque yo no he metido nada nuevo, y
tampoco he encontrado nada diferente, pero ya sabeis que nunca se
sabe…
El problema es a la hora de crear el objecto contrato, que no sé porqué en
un proyecto hace 2 INSERT (uno al hacer el new y otro el save) y en el
otro sólo uno.

Este es el código del controlador igual en los dos proyectos:

  @contrato = Contrato.new(params[:contrato])
  @contrato.inmueble.clientes << Cliente.find(2)
  @contrato.cliente = Cliente.find(2)
  @contrato.tipo = params[:tipo]
  @contrato.fecha = Date.today
  @contrato.sustituir_datos()
  if @contrato.save()
   flash[:notice] = 'Contrato was successfully created.'
  else
    render :action => 'new'
  end
redirect_to :action => 'ver', :id => @contrato

Aquí funciona correctamente:
Processing ContratosController#crear_contrato (for 127.0.0.1 at
2007-05-29
13:02:55) [POST]
Session ID: 2bb51bbe02f2b9adf5776192539193a0
Parameters: {“commit”=>“Contrato”, “action”=>“crear_contrato”,
“contrato”=>{“inmueble_id”=>“32”}, “controller”=>“contratos”,
“misclientes”=>[“2”], “tipo”=>“reserva”, “inmueble_nombre”=>“uno”}
e[4;35;1mContrato Columns (0.000000)e[0m e[0mSHOW FIELDS FROM
contratose[0m
e[4;36;1mInmueble Load (0.000000)e[0m e[0;1mSELECT * FROM inmuebles
WHERE (inmuebles.id = 32) LIMIT 1e[0m
e[4;35;1mInmueble Columns (0.010000)e[0m e[0mSHOW FIELDS FROM
inmueblese[0m
e[4;36;1mCliente Load (0.000000)e[0m e[0;1mSELECT * FROM clientes
WHERE (clientes.id = ‘2’) LIMIT 1e[0m
e[4;35;1mCliente Load (0.000000)e[0m e[0mSELECT clientes.* FROM
clientes INNER JOIN contratos ON clientes.id = contratos.cliente_id
WHERE (contratos.inmueble_id = 32) e[0m
e[4;36;1mCliente Load (0.000000)e[0m e[0;1mSELECT * FROM clientes
WHERE (clientes.id = ‘2’) LIMIT 1e[0m
e[4;35;1mCliente Columns (0.000000)e[0m e[0mSHOW FIELDS FROM
clientese[0m
e[4;36;1mSQL (0.000000)e[0m e[0;1mBEGINe[0m
e[4;35;1mSQL (0.000000)e[0m e[0mINSERT INTO contratos (fecha,
documento, cliente_id, inmueble_id, tipo) VALUES(‘2007-05-29’,
‘/ruby/inmobiliaria/contratos/contratouno.txt’, 2, 32, ‘reserva’)e[0m
e[4;36;1mSQL (0.000000)e[0m e[0;1mCOMMITe[0m
Redirected to http://localhost:3000/contratos/ver/45

Aquí funciona mal:
Processing ContratoController#crear_contrato (for 127.0.0.1 at
2007-05-29
12:57:53) [POST]
Session ID: 06d03e67660ab448763c3619e8211243
Parameters: {“commit”=>“Contrato”, “action”=>“crear_contrato”,
“contrato”=>{“inmueble_id”=>“32”}, “controller”=>“contrato”,
“misclientes”=>[“2”], “inmueble_nombre”=>“uno”, “tipo”=>“reserva”}
e[4;36;1mContrato Columns (0.000000)e[0m e[0;1mSHOW FIELDS FROM
contratose[0m
e[4;35;1mInmueble Columns (0.000000)e[0m e[0mSHOW FIELDS FROM
inmueblese[0m
e[4;36;1mInmueble Load (0.000000)e[0m e[0;1mSELECT * FROM inmuebles
WHERE (inmuebles.id = 32) e[0m
e[4;35;1mCliente Columns (0.000000)e[0m e[0mSHOW FIELDS FROM
clientese[0m
e[4;36;1mCliente Load (0.000000)e[0m e[0;1mSELECT * FROM clientes
WHERE (clientes.id = 2) e[0m
e[4;35;1mCliente Load (0.000000)e[0m e[0mSELECT clientes.* FROM
clientes INNER JOIN contratos ON clientes.id = contratos.cliente_id
WHERE ((contratos.inmueble_id = 32)) e[0m
e[4;36;1mSQL (0.000000)e[0m e[0;1mBEGINe[0m
e[4;35;1mSQL (0.000000)e[0m e[0mINSERT INTO contratos (fecha,
documento, cliente_id, inmueble_id, tipo) VALUES(NULL, ‘’, 2,
32, ‘reserva’)e[0m
e[4;36;1mSQL (0.000000)e[0m e[0;1mCOMMITe[0m
e[4;35;1mCliente Load (0.000000)e[0m e[0mSELECT * FROM clientes
WHERE
(clientes.id = 2) e[0m
e[4;36;1mSQL (0.000000)e[0m e[0;1mBEGINe[0m
e[4;35;1mSQL (0.000000)e[0m e[0mMysql::Error: Duplicate entry
‘2-32-reserva’ for key 2: INSERT INTO contratos (fecha, documento,
cliente_id, inmueble_id, tipo) VALUES(‘2007-05-29’,
‘/ruby/inmobiliaria/contratos/contratouno.txt’, 2, 32, ‘reserva’)e[0m
e[4;36;1mSQL (0.000000)e[0m e[0;1mROLLBACKe[0m

No entiendo porque intenta hacer dos INSERT???
qué puede haber diferente?? es que ya no sé dónde buscar…
Gracias

On 5/29/07, [email protected] [email protected] wrote:

  end
redirect_to :action => 'ver', :id => @contrato

Nos podrías enviar el código de los modelos de datos?

On 5/29/07, [email protected] [email protected] wrote:

  end
redirect_to :action => 'ver', :id => @contrato

Qué pasa si sacás la segunda línea?
@contrato.inmueble.clientes << Cliente.find(2)