Esercitazioneguidata Collegamento Uno Molti

1,065 views

Published on

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

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,065
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
17
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Esercitazioneguidata Collegamento Uno Molti

  1. 1. Esercitazione guidata: 4) collegamento tra due tabelle con relazione uno a molti Prof. Silvano Natalizi VA Liceo Tecnico – maggio 2009
  2. 2. Collegamento tra 2 tabelle con relazione uno a molti <ul><li>Partiamo da una soluzione ad un problema concreto </li></ul><ul><li>Si vuole dare la possibilità online di prenotarsi per un viaggio </li></ul><ul><li>Esiste una lista con il programma dei viaggi previsti </li></ul><ul><li>Gli utenti possono prenotare il viaggio fino al raggiungimento del numero massimo che generalmente è la capienza del volo aereo </li></ul>
  3. 3. Schema concettuale
  4. 4. Vogliamo ottenere una pagina web di questo tipo
  5. 5. Crea l’applicazione viaggi <ul><li>rails viaggi </li></ul><ul><li>cd viaggi </li></ul>
  6. 6. Genera la tabella viaggi <ul><li>Genera tutto il codice della tabella viaggi automaticamente </li></ul><ul><ul><li>ruby script/generate scaffold viaggi nome:string desc:text datapartenza:datetime durata:integer capogruppo:string cellulare:string prezzo:integer </li></ul></ul><ul><ul><li>rake db:migrate </li></ul></ul>
  7. 7. Genera la tabella prenotati <ul><li>Genera tutto il codice di prenotati </li></ul><ul><li>La 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 </li></ul><ul><li>ruby script/generate scaffold prenotati nome:string cellulare:string localita:string email:string sesso:string eta:integer viaggi_id:integer </li></ul><ul><li>rake db:migrate </li></ul>
  8. 8. Inserire alcuni dati di prova <ul><li>Inserire alcuni dati di prova nella tabella viaggis </li></ul><ul><ul><li>ruby script/server </li></ul></ul><ul><ul><li>localhost:3000/viaggis </li></ul></ul><ul><ul><li>new </li></ul></ul><ul><ul><li>inserire un viaggio </li></ul></ul><ul><ul><li>create </li></ul></ul>
  9. 9. Creiamo la form parziale per la prenotazione <ul><li>copia appviewsprenotatis ew.html.erb in appviewsviaggisnew_prenotazione.html.erb </li></ul>
  10. 10. Questa à la form di input <ul><li>elimina la riga 39 del link </li></ul>
  11. 11. Inserisci la form parziale new_prenotato.html.erb nella view show.html.erb <ul><li>apri la view appviewsviaggishow.html.erb </li></ul><ul><li>inserisci la riga 36 come in figura </li></ul><ul><li>Questa form parziale deve apparire nella pagina del viaggio </li></ul>
  12. 12. Modifica la form _new_prenotato.html.erb <ul><li>togli la @ in @prenotati così da trasformare la variabile globale in variabile locale </li></ul><ul><li>La variabile @prenotati gli veniva passata dal metodo new del controllore prenotatis </li></ul><ul><li>ora questa form non è più linkata a questo controllore, ma al controllore viaggis </li></ul><ul><li>Pertanto la variabile @prenotati non è più inizializzata </li></ul><ul><li>Questa è la ragione per la quale dobbiamo trasformarla in variabile locale </li></ul>
  13. 13. Come passiamo delle variabili locali ad un parziale <ul><li>Apri la view show.html.erb della cartella views/viaggis </li></ul><ul><li>Modifica la riga 36 in questo modo </li></ul><ul><li><%= render :partial=>”new_prenotato”, :locals=>{:prenotati=>Prenotati.new} %> </li></ul>
  14. 14. Prova il programma: localhost:3000/viaggis
  15. 15. Scegli un viaggio, devi ottenere questa form
  16. 16. Elimina il campo viaggi chiave straniera dalla form <ul><li>Osserva che c’è il campo viaggi che serve per digitare la chiave straniera. </li></ul><ul><li>Tuttavia questo dato, che collega la tabella viaggi con quella delle prenotazioni, non deve e non può essere dato in gestione all’utente. </li></ul><ul><li>E’ il programma responsabile della sua amministrazione </li></ul><ul><li>Di conseguenza il campo chiave straniera va tolto dalla form parziale </li></ul><ul><li>Elimina le righe dalla 30 alla 33 della form parziale _new_prenotato.html.erb fino ad ottenere l’allegata form </li></ul>
  17. 17. Bisogna comunque passare la chiave straniera viaggi_id <ul><li>Alla riga 36 di show.html.erb aggiungi come parametro (:viaggi_id=>@viaggi.id) </li></ul><ul><li>Devi ottenere il codice della riga 36 mostrato in allegato </li></ul>
  18. 18. Ricarica la pagina, e vedi che non c’è più il campo viaggi
  19. 19. Prima di pigiare il bottone create per memorizzare i dati <ul><li>Devi comunque salvare la chiave straniera nella form usando un campo nascosto </li></ul><ul><li>Aggiungi questa riga 5 </li></ul><ul><li><%= f.hidden_field :viaggi_id, :value=>@viaggi.id %> </li></ul><ul><li>nel parziale _new_prenotato.html.erb </li></ul>
  20. 20. Aggiungiamo un altro parziale per mostrare la lista dei viaggiatori prenotati <ul><li>apri la view index.html.erb nella cartella views/prenotatis </li></ul>
  21. 21. Salva la view precedente <ul><li>salva la index.html.erb </li></ul><ul><li>nella cartella viaggis </li></ul><ul><li>con il nome _prenotati_lista.html.erb </li></ul><ul><li>Elimina la riga 11 e 22 della chiave straniera </li></ul><ul><li>Elimina la riga 32 del link </li></ul>
  22. 22. Inserisci il parziale nella view <ul><li>Inserisci il parziale nella view show.html.erb </li></ul><ul><li><%= render :partial=>”prenotati_lista”, :locals=>{:prenotatis=> </li></ul><ul><li>Prenotati.find(:all) } </li></ul><ul><li>%> </li></ul>
  23. 23. Prova il programma
  24. 24. Abbiamo ottenuto la pagina web desiderata, ma… <ul><li>Abbiamo ottenuto la pagina web desiderata, ma c’è un errore. </li></ul><ul><li>Naviga su http://localhost:3000/viaggis/2 </li></ul><ul><li>Osserva che il viaggio è cambiato, ma i prenotati sono gli stessi del viaggio precedente !! </li></ul><ul><li>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. </li></ul><ul><li>Soluzione: metti una clausola :conditions </li></ul><ul><li><%= render :partial=>&quot;prenotati_lista&quot;, :locals=>{:prenotatis=>Prenotati.find(:all, :conditions=>[&quot;viaggi_id=?&quot;,@viaggi.id])} %> </li></ul>
  25. 25. Soluzione più intelligente definiamo la relazione uno a molti tra le due tabelle <ul><li>Apri il modello Viaggi </li></ul><ul><li>Inserisci l’istruzione </li></ul><ul><li>has_many: prenotatis </li></ul>
  26. 26. Modifica la view per la nuova relazione <ul><li>Riscrivi la seguente istruzione in /viaggis/show.html.erb </li></ul><ul><li>Nella riga 35: </li></ul><ul><li><%= render :partial=>&quot;prenotati_lista&quot;, :locals=>{:prenotatis=>@viaggi.prenotatis} %> </li></ul>
  27. 27. Prova di nuovo il programma <ul><li>Naviga su </li></ul><ul><li>http://localhost:3000/viaggis/1 </li></ul><ul><li>http://localhost:3000/viaggis/2 </li></ul><ul><li>Devi vedere i viaggiatori prenotati per il primo viaggio nella prima pagina </li></ul><ul><li>I viaggiatori prenotati per il secondo viaggio nella seconda pagina </li></ul>

×