Has_one

He empezado esta semana con esto del ROR
y me gusta mucho, pero veo q algunas cositas se me escapan.

tengo una tabla empresas y otra actividads
de forma q empresa <-- 0,1 – Actividads (igual puse la flecha al
reves)

de forma q creo los modelos
empresa.rb
has_one :actividad

y

actividad.rb
belongs_to :empresa

creo los scaffold para ahorar lios.

por supuesto empresa me funciona bien.

ahora quiero q tras completar el formulario de una nueva empresa
aparezca el formulario de la actividad:

y le meto mano al codigo del controlador de empresa y lo dejo asi,

def newempresa
@empresa = Empresa.new
end

def createempresa
@empresa = Empresa.new(params[:empresa])
if @empresa.save
flash[:notice] = ‘Empresa was successfully created.’
redirect_to :action => ‘newactividad’, :id => @empresa
else
render :action => ‘newempresa’
end
end

modifico el nombre de los ficheros de las vistas de empresa y de
actividad q venian del scaffold

PERO AQUI ES DONDE CREO Q ALGO ALGO MAL:

dentro del mismo controlador de empresa, añado las funciones de creacion
de actividad. Q despues de aplicar la tecnica de ensayo y error lo tengo
asi,
(creo q no funciona, pero esa no es mi pregunta)

def newactividad
@empresa = Empresa.find(:id)
end

def createactividad
@empresa = Empresa.find(params[:id])
@actividad = Actividad.new(params[:actividad])
@empresa.actividad =@actividad
if @actividad.save
flash[:notice] = ‘Actividad was successfully created.’
redirect_to :action => ‘show’, :id => Empresa.find(params[:id])
else
render :action => ‘newactividad’, :id => Empresa.find(params[:id])
end
end

EL TEMA ES Q ME PARECE Q ME COMPLICO LA VIDA:
pasando variables e identificadores de empresa de aqui para aca.
pues en cada vista tengo q ir pasando el identificador del padre asi:

<%= start_form_tag :action => ‘createactividad’, :id => @empresa%>

y claro en algun sitio pierdo el valor del identificador de empresa y al
final me de error.

NO SE SI ESTA ES LA FORMA CORRECTA DE TRATAR LOS OBJETOS.

Finalmete voy a hacelo como os dije, aunque no me gusta como queda,
aunque supongo q si nadie dice nada es porq es correcto.

en el segundo formulario, cuando ya he creado la empresa y completo los
datos de actividad, tengo la vista asi:

<%= start_form_tag :action => ‘createactividad’, :id => @empresa%>
<%= render :partial => ‘formactividad’ %>
<%= submit_tag “Continuar >>”, :id => @empresa %>
<%= end_form_tag %>

en el controlador cre los metodos asociados:

def newactividad
@empresa = Empresa.find(params[:id])
end

def createactividad
@empresa = Empresa.find(params[:id])
@actividad = Actividad.new(params[:actividad])
@empresa.actividad =@actividad
if @empresa.actividad.save
flash[:notice] = ‘Actividad was successfully created.’
redirect_to :action => ‘show’, :id => Empresa.find(params[:id])
else
render :action => ‘newactividad’, :id => Empresa.find(params[:id])
end
end

pero me da un error q no entiedo, pq yo no hago ningun update.
Mysql::Error: #42S22Unknown column ‘id’ in ‘where clause’:
UPDATE actividads
SET empresa_id = 24, iae = NULL, …
WHERE id = 0

entiendo lo q me dices, pero no veo la solucion,

yo solo quiero crear un registro actividad relacionado por empresa_id
con el padre, la tabla empresa con identificador ID q acabo d crear

es que la instancia de @empresa la estás creando
a partir de un find, es decir, das por hecho que
ya existía previamente en la base de datos y por
lo tanto, cuando vayas a guardar los cambios
estarás haciendo un ‘update’ en lugar de un ‘insert’

saludos

At 17:27 08/11/2006, you wrote:

<%= end_form_tag %>
@empresa.actividad =@actividad
UPDATE actividads
SET empresa_id = 24, iae = NULL, …
WHERE id = 0

/**

quitando if @actividad.save
se quita el problema, pero no me gusta saltarme ese paso.

si utilizas el método find para crear la instancia, tendrás que utilizar
el método update_attributes

saludos

On Thu, 2006-11-09 at 01:33 +0100, Raul wrote:

entiendo lo q me dices, pero no veo la solucion,

yo solo quiero crear un registro actividad relacionado por empresa_id
con el padre, la tabla empresa con identificador ID q acabo d crear


/**

Borja =?ISO-8859-1?Q?Mart=EDn?= wrote:

si utilizas el método find para crear la instancia, tendrás que utilizar
el método update_attributes

saludos

gracias lo estudiare ahora mismo

pero me continuo preguntando, tengo q utilizar el metodo find y los
parametros
para heredar una instancia q he creado ahora mismo en el anterior
formulario?