Esercitazioneguidata Collegamento Uno Molti

27
Esercitazione guidata: 4) collegamento tra due tabelle con relazione uno a molti Prof. Silvano Natalizi VA Liceo Tecnico – maggio 2009

description

Come creare una view con dati di due tabelle relazionali collegate con una relazione uno a molti

Transcript of Esercitazioneguidata Collegamento Uno Molti

Page 1: Esercitazioneguidata Collegamento Uno Molti

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

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

Schema concettuale

Page 4: Esercitazioneguidata Collegamento Uno Molti

Vogliamo ottenere una pagina web di questo tipo

Page 5: Esercitazioneguidata Collegamento Uno Molti

Crea l’applicazione viaggi

rails viaggi cd viaggi

Page 6: Esercitazioneguidata Collegamento Uno Molti

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

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

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

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

Questa à la form di input

elimina la riga 39 del link

Page 11: Esercitazioneguidata Collegamento Uno Molti

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

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

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

Prova il programma:localhost:3000/viaggis

Page 15: Esercitazioneguidata Collegamento Uno Molti

Scegli un viaggio, devi ottenere questa form

Page 16: Esercitazioneguidata Collegamento Uno Molti

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

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

Ricarica la pagina, e vedi che non c’è più il campo viaggi

Page 19: Esercitazioneguidata Collegamento Uno Molti

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

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

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

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

Prova il programma

Page 24: Esercitazioneguidata Collegamento Uno Molti

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

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

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

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