Download - Esercitazioneguidata Collegamento Uno Molti
![Page 1: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/1.jpg)
Esercitazione guidata: 4) collegamento tra due
tabelle con relazione uno a molti
Prof. Silvano Natalizi
VA Liceo Tecnico – maggio 2009
![Page 2: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/2.jpg)
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
![Page 3: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/3.jpg)
Schema concettuale
![Page 4: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/4.jpg)
Vogliamo ottenere una pagina web di questo tipo
![Page 5: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/5.jpg)
Crea l’applicazione viaggi
rails viaggi cd viaggi
![Page 6: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/6.jpg)
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
![Page 7: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/7.jpg)
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
![Page 8: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/8.jpg)
Inserire alcuni dati di prova
Inserire alcuni dati di prova nella tabella viaggis ruby script/server localhost:3000/viaggis new inserire un viaggio create
![Page 9: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/9.jpg)
Creiamo la form parziale per la prenotazione
copia \app\views\prenotatis\new.html.erb in \app\views\viaggis\_new_prenotazione.html.erb
![Page 10: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/10.jpg)
Questa à la form di input
elimina la riga 39 del link
![Page 11: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/11.jpg)
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
![Page 12: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/12.jpg)
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
![Page 13: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/13.jpg)
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} %>
![Page 14: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/14.jpg)
Prova il programma:localhost:3000/viaggis
![Page 15: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/15.jpg)
Scegli un viaggio, devi ottenere questa form
![Page 16: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/16.jpg)
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
![Page 17: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/17.jpg)
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
![Page 18: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/18.jpg)
Ricarica la pagina, e vedi che non c’è più il campo viaggi
![Page 19: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/19.jpg)
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
![Page 20: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/20.jpg)
Aggiungiamo un altro parziale per mostrare la lista dei viaggiatori prenotati
apri la view index.html.erb nella cartella views/prenotatis
![Page 21: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/21.jpg)
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
![Page 22: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/22.jpg)
Inserisci il parziale nella view
Inserisci il parziale nella view show.html.erb
<%= render :partial=>”prenotati_lista”, :locals=>{:prenotatis=>
Prenotati.find(:all) }
%>
![Page 23: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/23.jpg)
Prova il programma
![Page 24: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/24.jpg)
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])} %>
![Page 25: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/25.jpg)
Soluzione più intelligentedefiniamo la relazione uno a molti tra le due
tabelleApri il modello ViaggiInserisci l’istruzione
has_many: prenotatis
![Page 26: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/26.jpg)
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} %>
![Page 27: Esercitazioneguidata Collegamento Uno Molti](https://reader035.vdocuments.mx/reader035/viewer/2022062708/558a1a2cd8b42ad7618b45c0/html5/thumbnails/27.jpg)
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