340 likes | 492 Views
Model-objecten en hun relaties in Ruby on Rails. Webprogrammeren, week 1. Vandaag. Domein model ontwerpen (UML) Op papier >> rapport Views ontwerpen Schetsjes Associaties realiseren in RoR Model objecten Database tabellen Views: een klikmodel. Lagen in een applicatie. Gebruiker.
E N D
Model-objecten en hun relatiesin Ruby on Rails Webprogrammeren, week 1 Wolter Kaper - w.h.kaper@uva.nl
Vandaag • Domein model ontwerpen (UML) • Op papier >> rapport • Views ontwerpen • Schetsjes • Associaties realiseren in RoR • Model objecten • Database tabellen • Views: een klikmodel Wolter Kaper - w.h.kaper@uva.nl
Lagen in een applicatie Gebruiker User Interface Laag Domein Model, Modellen Laag Database Laag Wolter Kaper - w.h.kaper@uva.nl
Domein model bevat 1 1 1 Bedrijf 0..* 0..* heeft 1 0..3 1..* Team Werknemer Persoon 1..* 0..* Aandeelhouder is een Wolter Kaper - w.h.kaper@uva.nl
Wat is een domein model? • Ontwerp voor een set object klassen • Overeenkomst met buitenwereld • Relaties zijn aangegeven • “is een” relaties: erfelijkheid • “heeft” relaties • “bevat” relaties (existentie afhankelijk) • Datavelden • Methoden Wolter Kaper - w.h.kaper@uva.nl
Lagen in een applicatie Gebruiker User Interface Laag Domein Model, Modellen Laag Database Laag Wolter Kaper - w.h.kaper@uva.nl
Lagen volgens MVC + ORM Gebruiker + browser URL View Controller actie Modelobject Databasetabel Wolter Kaper - w.h.kaper@uva.nl
Doel voor vrijdagmiddag: • Domein model op papier: • Welke objectklassen, relaties ertussen, • Datavelden en methoden (hoeft niet compleet) • Implementeren in Rails als “snel prototype” • Schermbeelden hangen zinnig samen met objecten, • Kliks brengen je van het ene naar het andere scherm, • Basisdingen – new, index, edit,… - werken. Wolter Kaper - w.h.kaper@uva.nl
Relaties en hoe je ze realiseert In Ruby on Rails Wolter Kaper - w.h.kaper@uva.nl
Eén naar meer relatie A A B B 0..1 * 0..1 * Wolter Kaper - w.h.kaper@uva.nl
primaire sleutel verwijzende sleutel “Een naar meer” relatie:in de database flatgebouw: references flatgebouws bewoners Wolter Kaper - w.h.kaper@uva.nl
class Flatgebouw has_many :bewoners ... end class Bewoner belongs_to :flatgebouw ... end “Eén naar meer” relatie: in model klassen Wolter Kaper - w.h.kaper@uva.nl
Ruby on Rails ORM regels • Elke tabel een “id” kolom (autonummering) • Tabelnaam: engels meervoud van object klassenaam • Verwijzende sleutel: objectklasse waarnaar wordt verwezen + “_id” • In objectklassen: has_many, has_one, belongs_to Wolter Kaper - w.h.kaper@uva.nl
Eén naar meer: schermontwerp Flatgebouwen Flatgebouw Adres Bouwjaar Bewoners new del edit del edit update Bewoner Naam Huisnummer Flatgebouw new del edit del edit Finkelstein update Wolter Kaper - w.h.kaper@uva.nl
Eén naar meer “bevat” (“contains”) A B 1 * Wolter Kaper - w.h.kaper@uva.nl
primaire sleutel verwijzende sleutel “Een naar meer” “bevat” relatiein de database bedrijfs divisies Wolter Kaper - w.h.kaper@uva.nl
class Bedrijf has_many :divisies, \ :dependent => :destroy ... end class Divisie belongs_to :bedrijf ... end “Eén naar meer” “bevat” relatie in de model klassen Wolter Kaper - w.h.kaper@uva.nl
“Eén naar meer” “bevat” relatie:URL routering • GET /bedrijfs/1 • GET /divisies/2…. …óf: • GET /bedrijfs/1/divisies/2 • map.resources :bedrijfs map.resources :divisies …. …óf: • map.resources :bedrijfs, :has_many=>:divisies params[…] bedrijfs_id id in divisies_controller Wolter Kaper - w.h.kaper@uva.nl
“Meer naar meer” A B * * 1 1 * * A B A_B Wolter Kaper - w.h.kaper@uva.nl
“Meer naar meer”: database boeks auteurs Wolter Kaper - w.h.kaper@uva.nl
Oplossing: extra tabel boekauteurs Wolter Kaper - w.h.kaper@uva.nl
class Boek has_many :boekauteurs has_many :auteurs, \ :through => :boekauteurs ... end class Auteur has_many :boekauteurs has_many :boeks, \ :through => :boekauteurs ... end “Meer naar meer” relatie in de model klassen Class Boekauteur belongs_to :boek belongs_to :auteur … end Notitie: “\” dient om een statement te verdelen over meerdere regels. Wellicht heb je hem hier niet nodig! Wolter Kaper - w.h.kaper@uva.nl
class Boek has_many :boeks_auteurs, \ :dependent => :destroy has_many :auteurs, \ :through => :boeks_auteurs ... end class Auteur has_many :boeks_auteurs, \:dependent => :destroy has_many :boeks, \ :through => :boeks_auteurs ... end “Meer naar meer” relatie in de model klassen Class Boekauteur belongs_to :boek belongs_to :auteur … end Wolter Kaper - w.h.kaper@uva.nl
“Is een” relatie Werknemer Persoon Aandeelhouder Wolter Kaper - w.h.kaper@uva.nl
“is een” relatie – erfelijkheidin de database • Single Table Inheritance • Multiple Table Inheritance Wolter Kaper - w.h.kaper@uva.nl
Persoon naam Werknemer salaris Single Table Inheritance Modellen laag... • Aandeelhouder • kapitaal • Persoons • type • naam • salaris • kapitaal Database laag... Wolter Kaper - w.h.kaper@uva.nl
Single Table Inheritance class Persoon < ActiveRecord::Base ... end class Werknemer < Persoon ... end class Aandeelhouder < Persoon ... end Wolter Kaper - w.h.kaper@uva.nl
Single table inheritance • Subklassen worden in één tabel opgeslagen • Tabel krijgt naam van de hoofdklasse (in meervoud) • Kolom “type” geeft subklasse aan • Veel cellen blijven leeg (null) Wolter Kaper - w.h.kaper@uva.nl
Persoon naam Werknemer salaris Multiple Table Inheritance Modellen laag... • Aandeelhouder • kapitaal Database laag... • Aandeelhouder • id • naam • kapitaal • Werknemer • id • naam • salaris Wolter Kaper - w.h.kaper@uva.nl
Multiple Table Inheritance class Persoon < ActiveRecord::Base self.abstract = true ... end class Werknemer < Persoon ... end class Aandeelhouder < Persoon ... end Wolter Kaper - w.h.kaper@uva.nl
Single of Multiple Table? • Single • Als je met één query objecten van diverse subtypen wilt ophalen • Als je de subtypen zonder onderscheid wilt kunnen behandelen • Multiple • Als de subtypen veel verschillende kolommen hebben Wolter Kaper - w.h.kaper@uva.nl
Gegevenstypen Wolter Kaper - w.h.kaper@uva.nl
Voorbeeldjes “snel prototype” • één-naar-meer: • Blog tutorial – rails site – ken je al • meer-naar-meer • http://staff.science.uva.nl/~kaper/webprog/handouts/MeerNaarMeer.zip • is-een • http://staff.science.uva.nl/~kaper/webprog/handouts/IsEen.zip Wolter Kaper - w.h.kaper@uva.nl
Doel voor vrijdagmiddag: • Domein model op papier: • Welke objectklassen, relaties ertussen, • Datavelden en methoden (hoeft niet compleet) • Implementeren in Rails als “snel prototype” • Schermbeelden hangen zinnig samen met objecten, • Kliks brengen je van het ene naar het andere scherm, • Basisdingen – new, index, edit,… - werken. Wolter Kaper - w.h.kaper@uva.nl