Problema salvataggio relazioni 1 a 1

Salve a tt, è da un po che sto sviluppando un questionario on-line in
rails ora, il mio problema è che non riesco a far salvare i dati
all’interno del database. Premettendo che sto utilizzando la versione
1.2.5 di Rails e 1.8.5 di gem, il mio problema è che quando vado a
salvare all’interno del db mi viene generato questo messaggio d’errore:

Mysql::Error: Column ‘questionario_id’ cannot be null: INSERT INTO
dati_personalis (azienda, contatto, questionario_id, cognome,
nome, created_at) VALUES(‘Azienda SRL’, ‘023543454’, NULL, ‘Rossi’,
‘Mario’, ‘2008-01-25 17:19:03’)

in pratica le info vengono matenute in un cookie, dopo di che vengono
richiamate e salvate in delle varibili d’istanza, il problema e’ che
questionario_id e’ nullo e quindi i record non vengono salvati. Il
codice del controller e’:

def salvataggio_globale

@sessione = trova_sessione

@dati_personali = DatiPersonali.new
questionario = Questionario.new

@dati_personali = @sessione.ritorna_dati
@questionario = @sessione.ritorna_questionario

unless @dati_personali.save!

@questionario.dati_personali = @dati_personali#salvataggio

redirect_to(:action => 'index')

end

end

in cosa sbaglio? Ho letto che sè esiste un tipo di relazione 1 ad 1 tra
due tabelle bisogna dichiarare il model della tabella che contiene la
chiave esterna belong_to :nome_modello_tabella_figlia e per il model
della tabella figlia has_one :nome_modello_tabella_padre.

Nessuna idea a riguardo? Volevo almeno avere conferma che la procedura
di salvataggio per questo tipo di relazione fosse corretta…

Ettore J. r. wrote:

Nessuna idea a riguardo? Volevo almeno avere conferma che la procedura
di salvataggio per questo tipo di relazione fosse corretta…

Il problema probabilmente e’ nella migrazione della tabella
dati_personalis, che contiene il campo questionario_id dichiarato con
l’opzione :null => false

Con questa opzione, quando salvi l’oggetto @dati_personali la relazione
deve essere già impostata.

Quindi nel tuo caso la procedura corretta richiederebbe:

  • che l’oggetto @questionario sia salvato prima di @dati_personali (e
    questo non è chiaro dal tuo codice, dove il questionario sembra preso
    dalla sessione come oggetto pre-esistente, ma già salvato o no?), e

  • che @dati_personali.questionario sia impostato prima di
    @dati_personali.save! : si tratta di impostare la relazione dalla parte
    opposta, che tra l’altro ti salva un UPDATE su db

P.S. Perchè quelle due linee di codice?

@dati_personali = DatiPersonali.new
questionario = Questionario.new
Sembrano inutili, visto che nelle due righe successive prendi i dati
dalla sessione

Era proprio come dicevi tu, la relazione andava impostata prima e
@questionario non veniva salvato.
Il problema è che all’interno del testo in cui sto studiando il
salvataggio è spiegato in maniera errata e quindi per me era difficile
capire. A tal proposito hai qualche testo un po più valido da
consigliarmi? Non vorrei di nuovo incorrere in errori di questo tipo…

Grazie per l’aiuto, saluti.

Ettore J. r. wrote:

A tal proposito hai qualche testo un po più valido da
consigliarmi? Non vorrei di nuovo incorrere in errori di questo tipo…

Io ho studiato qualche anno fa sull’originale:

Dave T., David Heinemeier H.
“Agile Web D. with Rails”
(Pragmatic Bookshelf: By Developers, For Developers)

e l’ho trovato ottimo.
So che e’ uscita una versione aggiornata, ma prima di Rails 2.0.
Forse ora e’ meglio andare su:

Obie F.
“The Rails Way”
(http://www.amazon.co.uk/Rails-Way-Enterprise-Addison-Wesley-Professional/dp/0321445619)

Non l’ho letto di persona, ma su web ci sono ottime critiche.

Cmq leggiti questo post sul forum:
http://www.ruby-forum.com/topic/140235#new

ciao
io sto leggendo the rails way,
è estremamente affascinante e stimolante come libro,
non è un libro per principianti per un paio di motivi

  1. c’e un lungo elenco di prerequisiti sulle conoscenze di base
  2. ispirandosi a the Ruby Way non c’è il codice funzionante ma solo
    le righe che servono per spiegare il concetto

Dopo essere arrivato al terzo capitolo,
ho sospeso e ho iniziato the ruby way
Ciao Paolo