Esercitazioneguidata Collegamento Uno Molti
-
Upload
silvano-natalizi-itis-alessandro-volta-perugia -
Category
Education
-
view
843 -
download
3
description
Transcript of Esercitazioneguidata Collegamento Uno Molti
Esercitazione guidata: 4) collegamento tra due
tabelle con relazione uno a molti
Prof. Silvano Natalizi
VA Liceo Tecnico – maggio 2009
Collegamento tra 2 tabelle con relazione uno a molti
Partiamo da una soluzione ad un problema concreto
Si vuole dare la possibilità online di prenotarsi per un viaggio
Esiste una lista con il programma dei viaggi previsti
Gli utenti possono prenotare il viaggio fino al raggiungimento del numero massimo che generalmente è la capienza del volo aereo
Schema concettuale
Vogliamo ottenere una pagina web di questo tipo
Crea l’applicazione viaggi
rails viaggi cd viaggi
Genera la tabella viaggi
Genera tutto il codice della tabella viaggi automaticamente
ruby script/generate scaffold viaggi nome:string desc:text datapartenza:datetime durata:integer capogruppo:string cellulare:string prezzo:integer
rake db:migrate
Genera la tabella prenotati
Genera tutto il codice di prenotatiLa tabella prenotati è collegata con una
relaziona uno a molti con viaggi; pertanto deve avere la chiame primaria id di viaggi come chiave straniera viaggi_id
ruby script/generate scaffold prenotati nome:string cellulare:string localita:string email:string sesso:string eta:integer viaggi_id:integer
rake db:migrate
Inserire alcuni dati di prova
Inserire alcuni dati di prova nella tabella viaggis ruby script/server localhost:3000/viaggis new inserire un viaggio create
Creiamo la form parziale per la prenotazione
copia \app\views\prenotatis\new.html.erb in \app\views\viaggis\_new_prenotazione.html.erb
Questa à la form di input
elimina la riga 39 del link
Inserisci la form parziale new_prenotato.html.erb nella view show.html.erb
apri la view \app\views\viaggi\show.html.erb
inserisci la riga 36 come in figura
Questa form parziale deve apparire nella pagina del viaggio
Modifica la form _new_prenotato.html.erb
togli la @ in @prenotati così da trasformare la variabile globale in variabile locale
La variabile @prenotati gli veniva passata dal metodo new del controllore prenotatis
ora questa form non è più linkata a questo controllore, ma al controllore viaggis
Pertanto la variabile @prenotati non è più inizializzata
Questa è la ragione per la quale dobbiamo trasformarla in variabile locale
Come passiamo delle variabili locali ad un parziale
Apri la view show.html.erb della cartella views/viaggis
Modifica la riga 36 in questo modo
<%= render :partial=>”new_prenotato”, :locals=>{:prenotati=>Prenotati.new} %>
Prova il programma:localhost:3000/viaggis
Scegli un viaggio, devi ottenere questa form
Elimina il campo viaggi chiave straniera dalla form
Osserva che c’è il campo viaggi che serve per digitare la chiave straniera.
Tuttavia questo dato, che collega la tabella viaggi con quella delle prenotazioni, non deve e non può essere dato in gestione all’utente.
E’ il programma responsabile della sua amministrazione
Di conseguenza il campo chiave straniera va tolto dalla form parziale
Elimina le righe dalla 30 alla 33 della form parziale _new_prenotato.html.erb fino ad ottenere l’allegata form
Bisogna comunque passare la chiave straniera viaggi_id
Alla riga 36 di show.html.erb aggiungi come parametro (:viaggi_id=>@viaggi.id)
Devi ottenere il codice della riga 36 mostrato in allegato
Ricarica la pagina, e vedi che non c’è più il campo viaggi
Prima di pigiare il bottone create per memorizzare i dati
Devi comunque salvare la chiave straniera nella form usando un campo nascosto
Aggiungi questa riga 5
<%= f.hidden_field :viaggi_id, :value=>@viaggi.id %>
nel parziale _new_prenotato.html.erb
Aggiungiamo un altro parziale per mostrare la lista dei viaggiatori prenotati
apri la view index.html.erb nella cartella views/prenotatis
Salva la view precedente
salva la index.html.erb
nella cartella viaggis
con il nome _prenotati_lista.html.erb
Elimina la riga 11 e 22 della chiave straniera
Elimina la riga 32 del link
Inserisci il parziale nella view
Inserisci il parziale nella view show.html.erb
<%= render :partial=>”prenotati_lista”, :locals=>{:prenotatis=>
Prenotati.find(:all) }
%>
Prova il programma
Abbiamo ottenuto la pagina web desiderata, ma…
Abbiamo ottenuto la pagina web desiderata, ma c’è un errore. Naviga su http://localhost:3000/viaggis/2 Osserva che il viaggio è cambiato, ma i prenotati sono gli stessi del
viaggio precedente !! Ciò è dovuto al fatto che abbiamo passato alla form parziale
_prenotati_lista.html.erb, un array contenente il risultato della query :prenotati=>Prenotati.find(:all), che corrisponde alla select * from prenotatis; non c’è nessuna clausola where per restituite solo i prenotati di quel viaggio.
Soluzione: metti una clausola :conditions <%=
render :partial=>"prenotati_lista", :locals=>{:prenotatis=>Prenotati.find(:all, :conditions=>["viaggi_id=?",@viaggi.id])} %>
Soluzione più intelligentedefiniamo la relazione uno a molti tra le due
tabelleApri il modello ViaggiInserisci l’istruzione
has_many: prenotatis
Modifica la view per la nuova relazione
Riscrivi la seguente istruzione in /viaggis/show.html.erb
Nella riga 35:
<%= render :partial=>"prenotati_lista", :locals=>{:prenotatis=>@viaggi.prenotatis} %>
Prova di nuovo il programma
Naviga su
http://localhost:3000/viaggis/1
http://localhost:3000/viaggis/2
Devi vedere i viaggiatori prenotati per il primo viaggio nella prima pagina
I viaggiatori prenotati per il secondo viaggio nella seconda pagina