lezione su rails relazioni
DESCRIPTION
come associare i modelli tra di loro. Come creare una view con i parzialiTRANSCRIPT
Prof. Silvano Natalizi
Classe VA Liceo Tecnico – aprile 2009
Un seat appartiene ad un unico aereo, ed in quanto tale l’entità Seat è debole. In tal caso la chiave id non potrebbe essere primaria, ma solo parziale. Tuttavia Rails fornisce id come chiave primaria surrogata e quindi possiamo considerare Seat come entità forte.
La relazione è uno a molti.
La relazione a basso livello tra le tabelle relazionali ha ripercussioni sia a livello del modello che dell’interfaccia grafica.
Il modello è lo strato a diretto contatto con il database. Le relazioni tra le tabelle devono diventare relazioni tra i loro modelli; pertanto relazioni tra i loro oggetti.
Anche l’interfaccia grafica ha campi che sono una opportuna mescolanza degli attributi dei modelli, come conseguenza della relazione tra i modelli.
Si può realizzare in molti modi diversi una view che ci faccia vedere insieme il volo e i posti per esso prenotati.
Ad esempio potremmo fare una view con una lista dei voli e, scelto uno di essi, un’altra view che ci dà l’elenco dei posti prenotati.
Oppure potremmo mettere i voli in una select, farli srotolare in un menù drop down, e fatta la scelta del volo, mostrare i dettagli del volo medesimo seguiti dall’elenco dei posti prenotati.
Nella parte in alto mettiamo i dati del volo
Nella parte centrale la lista delle prenotazioni
In basso una form per inserire una nuova prenotazione
La view della relazione è quindi una mescolanza di view già conosciute.
I dettagli del volo sono dati dalla view show.html.erb del modello Flight
La lista dei posti prenotati (seat) è la view index.html.erb del modello Seat
La form, per l’inserimento di un nuovo seat, è la view new.html.erb
Possiamo inserire nella view “show” il codice della “index” view e della “new” form
Dobbiamo pertanto copiare il codice da ciascuna view di seat in quella della pagina flight ?
Meglio ancora possiamo usare delle view “parziali” (partials) per il nuovo seat e per la lista dei posti prenotati!
Possiamo spezzare il contenuto di una pagina in file separati.
Questi file si chiamano “partial page templates” o più semplicemente “partials”.
I parziali sono dei file ERB, come le view. L’unica differenza è che i parziali iniziano con un underscore (_).
Abbiamo tre tipi di ERB: templates, layouts, partials. In cosa differiscono ? Come si accordano tra di loro ?
Possiamo assemblare una pagina web con i files ERB, così come possiamo farcire un panino con una pila di ingredienti.
Il layout fornisce alle pagine web un look coerente, tramite pezzi standard di codice html in cima ed in fondo a ciascuna pagina, come una focaccia che avvolge il panino.
Per default, tutte le pagine associate fon un dato controllore condividono il medesimo layout
Un Template è il contenuto principale di una pagina web, come il prosciutto di un panino.
Un template è associato ad una azione. C’è il template che show (mostra ) i dettagli del volo, ed un altro per la form “New flight”
Un template può richiamare partials per costruire il contenuto principale di una pagina
I parziali sono come i sotto ingredienti (di rifinitura) di un panino (pomodorini, lattuga…)
I parziali permettono di spezzare un template complicato in parti più piccole.
Ci permettono di separare il contenuto comune, come menù e barre di navigazione.
I parziali possono essere usati sia dai templates che dai layouts.
La definizione di una relazione, tra due modelli, semplifica il codice, riduce la probabilità di fare errori e facilita la lettura del codice
Nella relazione uno a molti, il collegamento tra le tabelle relazionali si ottiene tramite la chiave straniera; ossia copiando la chiave primaria id di Flight nella tabella Seat con il nome flight_id
La relazione collega i dati di seat e di flight facendo combaciare i dati della colonna flight_id con quelli della colonna id.
Una relazione tra modelli, fa apparire gli oggetti di un tipo come degli attributi di un altro tipo di oggetto.
Ad esempio, la relazione che collega il modello Flight con il modello Seat, ci permette di riferirci ai posti associato con un volo, semplicemente con l’istruzione
@flight.seats
Per ricavare tutti i posti associati ad un determinato volo, con l’SQL, dobbiamo fare una join tra le due tabelle e filtrare il flight richiesto:
Select * from flights, seats where flights.id=seats.flight_id and flight.id=@flight
Chiaramente è più semplice scrivere l’istruzione @flight.seats !!!!
Ci apprestiamo a dare al modello Flight un ulteriore attributo chiamato seats
La relazione si scrive all’interno del modello
Class Flight < ActiveRecord::Base
has_many :seats end
Has_many si inserisce nel modello che stà dalla parte dell’uno nella relazione
Si usa seats al plurale (il nome del modello al plurale) perché questo è un array.
L’attributo seats restituisce un array di oggetti seat associato con il flight
Quando abbiamo creato la relazione, abbiamo dato al modello Flight un nuovo attributo chiamato seats
@flight.seats Se conosciamo un oggetto flight, possiamo
conoscere i suoi posti prenotati. Ma se conosciamo un oggetto seat come
facciamo a sapere a quale oggetto flight esso corrisponde ?
Ci occorre una relazione che sia l’opposto di quella precedente. Dato un particolare oggetto seat vogliamo ottenere il suo volo.
Vogliamo definire un nuovo attributo per seat
@seat.flight Vogliamo sapere a quale volo appartiene
(belongs to) un seat. E ciascun seat ha uno ed un solo volo (flight).
class Seat <ActiveRecord::Base
belongs_to :flight end