Wolter Kaper - 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 Wolter Kaper -
Wolter Kaper - Lagen in een applicatie User Interface Laag Domein Model, Modellen Laag Database Laag Gebruiker
Wolter Kaper - Domein model Bedrijf WerknemerTeam * 1..* * Aandeelhouder 1 1..* Persoon is een heeft bevat
Wolter Kaper - 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 - Lagen in een applicatie User Interface Laag Domein Model, Modellen Laag Database Laag Gebruiker
Wolter Kaper - Lagen volgens MVC + ORM Gebruiker + browser ViewController Model object URL actie Database tabel
Wolter Kaper - 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 - Relaties en hoe je ze realiseert In Ruby on Rails
Eén naar meer relatie Wolter Kaper - AB 0..1 * AB *
Wolter Kaper - “Een naar meer” relatie: in de database idadresbouwjaar 1Lodewijk laan Braambos Kennedy laan idnaamhuis- nummer flatgebouw _id 1Jansen3051 2Pietersen3061 3Klaassen252NULL flatgebouwsbewoners primaire sleutelverwijzende sleutel flatgebouw: references
Wolter Kaper - “Eén naar meer” relatie: in model klassen class Flatgebouw has_many :bewoners... end class Bewoner belongs_to :flatgebouw... end
Wolter Kaper - 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
Eén naar meer: schermontwerp Wolter Kaper - Flatgebouwen editdel editdel new Flatgebouw Adres Bouwjaar Bewoners new editdel editdel update Bewoner Naam Huisnummer Flatgebouw Finkelstein update
Eén naar meer “bevat” (“contains”) Wolter Kaper - AB 1 *
Wolter Kaper - “Een naar meer” “bevat” relatie in de database idnaam 1Philips 2Shell 3Albert Heyn idnaambedrijf_id 1Gloeilampen1 2Electronica1 3Aardolieproducten2 bedrijfsdivisies primaire sleutelverwijzende sleutel
Wolter Kaper - “Eén naar meer” “bevat” relatie in de model klassen class Bedrijf has_many :divisies, \ :dependent => :destroy... end class Divisie belongs_to :bedrijf... end
“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 Wolter Kaper - bedrijfs_ididparams[…]in divisies_controller
“Meer naar meer” Wolter Kaper - AB * * AB 1 * A_B * 1
Wolter Kaper - “Meer naar meer”: database idtiteljaar 1Turks fruit1972 2Werkkleding1984 3Max Havelaar1880 4Proceedings of the 23th conference on fluorescence 2001 idachternaaminitialen 1WolkersJ. 2Douwes-DekkerE. 3JonesK. 4ButterworthL.F. boeksauteurs
Wolter Kaper - Oplossing: extra tabel boek_idauteur_id boekauteurs
Wolter Kaper - “Meer naar meer” relatie in de model klassen class Boek has_many :boekauteurs has_many :auteurs, \ :through => :boekauteurs... end class Auteur has_many :boekauteurs has_many :boeks, \ :through => :boekauteurs... end Notitie: “\” dient om een statement te verdelen over meerdere regels. Wellicht heb je hem hier niet nodig! Class Boekauteur belongs_to :boek belongs_to :auteur … end
Wolter Kaper - “Meer naar meer” relatie in de model klassen 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 Class Boekauteur belongs_to :boek belongs_to :auteur … end
“Is een” relatie Wolter Kaper - Persoon Werknemer Aandeelhouder
Wolter Kaper - “is een” relatie – erfelijkheid in de database Single Table Inheritance Multiple Table Inheritance
Wolter Kaper - Single Table Inheritance Persoon naam Werknemer salaris Aandeelhouder kapitaal Modellen laag... Database laag... Persoons type naam salaris kapitaal
Wolter Kaper - Single Table Inheritance class Persoon < ActiveRecord::Base... end class Werknemer < Persoon... end class Aandeelhouder < Persoon... end
Wolter Kaper - 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 - Multiple Table Inheritance Persoon naam Werknemer salaris Aandeelhouder kapitaal Modellen laag... Database laag... Werknemer id naam salaris Aandeelhouder id naam kapitaal
Wolter Kaper - Multiple Table Inheritance class Persoon < ActiveRecord::Base self.abstract = true... end class Werknemer < Persoon... end class Aandeelhouder < Persoon... end
Wolter Kaper - 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 - Gegevenstypen MySQL kolomtypenRails kolomtypenRuby variabelen TINYINT(1):booleanTrueclass / Falseclass DATE:dateDate DATETIME:datetimeTime DECIMAL:decimalBigDecimal / Integer FLOAT:floatFloat INT:integerFixnum VARCHAR(255):stringString TEXT:textString :references
Wolter Kaper - Voorbeeldjes “snel prototype” één-naar-meer: Blog tutorial – rails site – ken je al meer-naar-meer is-een
Wolter Kaper - 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.