-
Notifications
You must be signed in to change notification settings - Fork 16
Mallivastaus ja arvosteluperusteet
Erillistä kokeen palautustilaisuutta ei järjestetä. Oman kokeen arvostelusta voi kysyä suoraan kunkin tehtävän korjaajalta joko emailitse tai irkissä:
- tehtävät 1 ja 2 mluukkai, mluukkai@cs.helsinki.fi
- tehtävä 3 Loezi, leo.leppanen@cs.helsinki.fi
- tehtävä 4 kaltsoon1, kalle.ilves@helsinki.fi
MVC: periaate, jonka mukaan sovellus jaetaan erillisiin komponetteihin siten että sovelluslogiika on eristetty muista riippumattomiksi Modeleiksi. Sovelluksen toimintojen koordinoinnista (käyttäjän syötteisiin reagointi) huolehtii Kontrolleri ja HTML- (ja ideaaliilanteessa myös muuntyyppiset) näkymät generoidaan erillisten Viewien avulla.
Sovelluksen toiminta osoitteeseen http://localhost:3000/countries/1 HTTP GET -pyynön yhteydessä:
- routes.rb:n määrittelyn
get '/countries/:id', to:'countries#show'
takia pyynnön hoitaaCountriesController
-luokan metodishow
. - routes.rb:n määrittelyn ansiosta urlin resurssin yksilöivä osa asetetaan
params
-hashin avaimen:id
arvoksi - kontrolleri hakee tietokannasta tunnistetta vastaavan resurssin
- tietokantahaku tapahtuu resurssia vastaavan model-luokan
Country
luokkametodinfind
avulla - haettua resurssia käsitellään
Country
-luokan instanssina - kontrolleri asettaa haetun resurssin instanssimuuttujaan
@country
- kontrollerin lopussa suoritetaan oletusarvoisen näkymätemplaten
views/countries/show.html.erb
renderöinti - template 'näkee' kontrollerin asettaman instanssimuuttujan
@country
kautta sivua vastaavan maan - maata vastaava model-luokka on määritelty sisältämään joukon
City
-luokan olioita (has many...), joihin maa pääsee käsiksi metodincities
avulla - näkymätemplate renderöi maan sivulle (maan nimen lisäksi) each-iteraattorin avulla läpikäydenmaahan liittyvät kaupungit
- näkymätemplaten renderöinnin seurauksena syntyy HTML-sivu, joka palautetaan selaimelle yhdessä HTTP-statuskoodin (200) kanssa
Täydet pisteet jos suunilleen jokainen vaihe oli mainittu tai kävi vastauksesta ilmi. Noin -0.5p jokaisen oleellisen vaiheen maininnan puutteesta.
- selain tekee HTTP POST -pyynnön osoitteeseen /countries. Pyynnön mukana välittyy tieto luodun maan nimestä
- routes.rb:n määrittelyn
post '/countries', to:'countries#create'
perusteella kutsutaanCountriesController
:in metodiacreate
- kontrolleri pääsee käsiksi lomakkeen lähettämiin tietoihin
params
-muuttujan avulla, käyttäen require- ja permit-metodeja, käytännössä tieto on hash muotoa{ :name => "Finland" }
- kontrolleri luo uuden Country-olion lomakkeen tiedoilla ja tallettaa sen muuttujaan @country
- kontrolleri pyytää olioa tallentumaan kutsumalla sen metodia save
- tallennuksen yhteydessä suoritetaan modelin määrittelemät validoinnit, eli tarkistetaan onko maan nimi uniikki ja pituudeltaan vähintään 3 merkkiä
jos talletus onnistuu eli olio on validi:
- save palauttaa toden arvon
- uudelleenohjataan käyttäjän selain kaikkien maiden sivulle, käytännössä tämä tarkoittaa että HTTP-kutsuun vastataan statuskoodilla 302 ja tiedolla siitä, mihin urliin selaimen tulee tehdä HTTP GET
- selain siis tekee GET-pyynnön kaikkien maiden sivulle. Sivulla näytetään myös kontrollerin määrittelemä 'flash'-viesti
jos talletus ei onnistu eli olio on epävalidi:
- save palauttaa epätoden arvon
- maan luontiin tarkoitettu lomake 'new' renderöidään uudelleen
- validoinnin yhteydessä olioon on liitetty muuttuja
error
, jonka perusteella lomakkeelle renderöityvät validoinnin virheviestit - virheviesteillä varustettu lomake palautetaan pyynnön tehneelle selaimelle
pisteytys:
- POST ja reititys oikealle metodille 0.5p
- formin tietojen aksessointi ja olion luominen 0.5p
- validointi (millä perusteella ja milloin) 1p
- redirect jos validi 1p
- renderöinti virheilmoituksilla 1p
Kerro mitä ongelmia sivun toteutuksessa on suorituskyvyn kannalta? (1p)
- Sivua varten haetaan ensiksi kaikki maat omassa tietokantakyselyssä.
- Jokaisen maan kohdalla lasketaan maan väkiluku hakemalla kaikki maan kaupungit erillisissä kyselyissä ja laskemalla näiden väkiluvut yhteen.
- Rails käyttää relaatioissa oletusarvoisesti lazy loading-menetelmää, jossa yhteydet selvitetään vasta niitä pyydettäessä.
- Tehtävässä maan kaupungit selvitettiin vasta kun näkymässä pyydettiin maan väkilukua.
- Sivun luomiseen tehdään todella paljon tietokantapyyntöjä (N+1 ongelma), jonka takia sovelluksen suorituskyky on koetuksilla suurilla tietomäärillä.
Millä Railsin tarjoamilla tekniikoilla näitä voidaan optimoida? (1p) Mitkä ovat kunkin optimointitekniikan hyvät ja huonot puolet? (1p) Mitä muutoksia näiden käyttöönotto edellyttäisi koodin tasolla? (1p)
Vastauksessa piti kuvata vähintään kahta optimointitekniikkaa. Useat tekniikat ovat kompromisseja, joilla on sekä hyviä että huonoja puolia. Vastauksesta haluttiin myös konkreettinen kuvaus kunkin tekniikan käyttöönotosta.
- Modelin Union luonti ja Union-migraation kuvaus. (1p)
Jokin seuraavista:
- rails generate scaffold Union name:string year:integer
- rails generate model Union name:string year:integer
- Mallin luonti käsin, perintä ActiveRecord::Base. Migraation luonti: rails generate migration CreateUnions + kentät.
Joko 2.1. tai 2.2.
2.1. has_many, through:n käyttö.
- Liitostaulumigraation luonti tai taulun kuvaus. (1p)
- Modeleihin Country ja Union has_many:t (ja has_many, through:t). Liitostaulumodeliin belongs_to:t. (2p)
2.2. has_and_belongs_to_many:n käyttö.
- Liitostaulumigraation luonti tai taulun kuvaus. (1p)
- Modeleihin Country ja Union has_and_belongs_to_many:t. (2p)
Migraatioiden suoritus tietokantaan.
2.X. Liitostaulu(migraatio) muotoa:
class CreateJoinTable < ActiveRecord::Migration
def change
# 2.1. x on esim. :memberships
# 2.2. x on :countries_unions
create_table x do |t|
t.integer :country_id
t.integer :union_id
end
end
end