esercitazioneguidata collegamento uno molti

Post on 24-Jun-2015

843 Views

Category:

Education

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

top related