Lezione Su Rails Relazioni

29
Prof. Silvano Natalizi Classe VA Liceo Tecnico – aprile 2009

description

come associare i modelli tra di loro. Come creare una view con i parziali

Transcript of Lezione Su Rails Relazioni

Page 1: Lezione Su Rails Relazioni

Prof. Silvano Natalizi

Classe VA Liceo Tecnico – aprile 2009

Page 2: Lezione Su Rails Relazioni
Page 3: Lezione Su Rails Relazioni

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.

Page 4: Lezione Su Rails Relazioni

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.

Page 5: Lezione Su Rails Relazioni

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.

Page 6: Lezione Su Rails Relazioni

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

Page 7: Lezione Su Rails Relazioni
Page 8: Lezione Su Rails Relazioni

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

Page 9: Lezione Su Rails Relazioni

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!

Page 10: Lezione Su Rails Relazioni
Page 11: Lezione Su Rails Relazioni

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 (_).

Page 12: Lezione Su Rails Relazioni

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.

Page 13: Lezione Su Rails Relazioni
Page 14: Lezione Su Rails Relazioni

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

Page 15: Lezione Su Rails Relazioni

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”

Page 16: Lezione Su Rails Relazioni

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.

Page 17: Lezione Su Rails Relazioni
Page 18: Lezione Su Rails Relazioni
Page 19: Lezione Su Rails Relazioni

La definizione di una relazione, tra due modelli, semplifica il codice, riduce la probabilità di fare errori e facilita la lettura del codice

Page 20: Lezione Su Rails Relazioni
Page 21: Lezione Su Rails Relazioni

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.

Page 22: Lezione Su Rails Relazioni

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

Page 23: Lezione Su Rails Relazioni

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 !!!!

Page 24: Lezione Su Rails Relazioni

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

Page 25: Lezione Su Rails Relazioni

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

Page 26: Lezione Su Rails Relazioni

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 ?

Page 27: Lezione Su Rails Relazioni

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).

Page 28: Lezione Su Rails Relazioni

class Seat <ActiveRecord::Base

belongs_to :flight end

Page 29: Lezione Su Rails Relazioni