{"id":2877,"date":"2026-04-22T07:48:56","date_gmt":"2026-04-22T07:48:56","guid":{"rendered":"https:\/\/www.pulmaton.fi\/?p=2877"},"modified":"2026-04-22T07:52:53","modified_gmt":"2026-04-22T07:52:53","slug":"koodin-takana-leo-ruby-on-rails-helppoa-hauskaa-ja-tehokasta","status":"publish","type":"post","link":"https:\/\/www.pulmaton.fi\/en\/2026\/04\/22\/koodin-takana-leo-ruby-on-rails-helppoa-hauskaa-ja-tehokasta\/","title":{"rendered":"Koodin takana: Leo \u2013 Ruby on Rails: Helppoa, hauskaa ja tehokasta"},"content":{"rendered":"<p>Kun aloitin Pulmattomalla kes\u00e4ll\u00e4 2023, en ollut kuullutkaan <strong>Ruby on Railssista (RoR)<\/strong>. Kuitenkin hyvin nopeasti t\u00f6it\u00e4 tekem\u00e4ll\u00e4 ja minulle kustannettua alkeiskurssia tutkimalla p\u00e4\u00e4sin sis\u00e4\u00e4n RoR:n ihmeelliseen maailmaan ja huomasin ilokseni, ett\u00e4 vaikka RoR ei ole en\u00e4\u00e4 nyky\u00e4\u00e4n niin suosittu, kuin mit\u00e4 se oli noin 15 vuotta sitten, se on silti <strong>yll\u00e4tt\u00e4v\u00e4n helppo ja eritt\u00e4in looginen ohjelmistokehys<\/strong>.<\/p>\n\n\n\n<p><strong>Mit\u00e4 &#8221;ohjelmistokehys&#8221; sitten tarkoittaa? <\/strong>Ohjelmistokehys on er\u00e4\u00e4nlainen runko ohjelmistolle, jonka avulla pystyt\u00e4\u00e4n rakentamaan erilaisia monimutkaisiakin ratkaisuja hyvinkin pienell\u00e4 vaivalla. Muita tunnettuja ohjelmistokehyksi\u00e4 ovat esimerkiksi Pythonin Django, Microsoftin .NET Framework sek\u00e4 Javan Jade (Java Agent DEvelopment framework).<\/p>\n\n\n\n<p>Ruby sai alkunsa 90-luvun alussa, kun japanilainen <strong>Yukihiro Matsumoto<\/strong> totesi, ettei sopivaa olio-ohjelmointikielt\u00e4 ole olemassa, ja alkoi siksi v\u00e4s\u00e4\u00e4m\u00e4\u00e4n itse omaa ohjelmointikielt\u00e4\u00e4n. Ensimm\u00e4inen versio Rubysta, versio 0.95, ilmestyi vuonna 1995, ja uusia p\u00e4ivityksi\u00e4 tulee edelleen: viimeisin versio 4.0.2 tuli maaliskuun 16. p\u00e4iv\u00e4 t\u00e4n\u00e4 vuonna.<\/p>\n\n\n\n<p><strong>Yukihiron filosofia <\/strong>kielt\u00e4 luodessa oli luoda ohjelmointikieli, joka on tehokas, mutta ennen kaikkea <strong>hauska ja ihmisen kannalta helppo kirjoittaa<\/strong>. H\u00e4n totesi er\u00e4\u00e4ss\u00e4 haastattelussa vuonna 2003:<\/p>\n\n\n\n<p>\u201cOften people, especially computer engineers, focus on the machines. They think, \u2018By doing this, the machine will run fast. By doing this, the machine will run more effectively. By doing this, the machine will something something something.\u2019 They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves.\u201d<\/p>\n\n\n\n<p>Ihmisl\u00e4heisyys on ollut Rubyn kehityksess\u00e4 siis keski\u00f6ss\u00e4.<\/p>\n\n\n\n<p><strong>Mik\u00e4 tekee Railsista niin erityisen? <\/strong>Ruby on Rails syntyi, kun tanskalaisen <strong>David Heinemeier Hansson <\/strong>palkattiin kehitt\u00e4m\u00e4\u00e4n projektinhallintaj\u00e4rjestelm\u00e4. T\u00e4h\u00e4n Hansson k\u00e4ytti Rubya kehitt\u00e4\u00e4kseen ensin kehyksen, jonka avulla luoda pyydetty j\u00e4rjestelm\u00e4. J\u00e4rjestelm\u00e4n valmistuttua Hansson julkaisi ohjelmistokehyksens\u00e4 koodin ja noin vuoden kuluttua avasi koodin yleisesti muokattavaksi avoimen koodin ohjelmistokehykseksi.<\/p>\n\n\n\n<p>Mik\u00e4 sitten tekee RoR:ll\u00e4 ty\u00f6skentelemisest\u00e4 niin mukavaa?&nbsp; Ruby itsess\u00e4\u00e4n on, filosofiansa mukaisesti, helppoa ja hauskaa kirjoittaa. RoR on rakennettu siten, ett\u00e4 siin\u00e4 pystyy tekem\u00e4\u00e4n monimutkaisiakin asioita todella pienell\u00e4 m\u00e4\u00e4r\u00e4ll\u00e4 koodia. My\u00f6s konfiguraation v\u00e4h\u00e4inen m\u00e4\u00e4r\u00e4 on erinomainen asia.<\/p>\n\n\n\n<p>Ruby on Rails -kehyksess\u00e4 hy\u00f6dynnet\u00e4\u00e4n <strong>Convention over Configuration (CoC) -mallia<\/strong>. K\u00e4yt\u00e4nn\u00f6ss\u00e4 malli perustuu ajatukseen, ett\u00e4 ohjelmiston tulisi noudattaa yhteisi\u00e4, sovittuja tapoja (konventioita). Kun seuraa yleist\u00e4 mallia ja kaikki toimii, kuin rasvattu. Hyv\u00e4 esimerkki t\u00e4st\u00e4 on nime\u00e4misk\u00e4yt\u00e4nt\u00f6: kutsutaanko k\u00e4ytt\u00e4j\u00e4n ID:t\u00e4 nimityksell\u00e4 UserId, user_id, uid vai onko k\u00e4yt\u00f6ss\u00e4 jokin muu? Ruby on Railssissa on tietty konventio, jonka mukaan l\u00e4hes kaikki tapahtuu.<\/p>\n\n\n\n<p>Toinen t\u00e4rke\u00e4 malli on <strong>Model-View-Controller (MVC)<\/strong>.MVC on helppo implementoida ja lukea, ja mallin seuraaminen tekee ohjelmistosta loogista lukea ja tulkita. Model-View-Controller mallissa siis:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Model (malli)<\/strong> yhdist\u00e4\u00e4 tietokannan muuhun projektiin automaattisesti<\/li>\n\n\n\n<li><strong>View (n\u00e4kym\u00e4)<\/strong> m\u00e4\u00e4ritt\u00e4\u00e4, mit\u00e4 k\u00e4ytt\u00e4j\u00e4 n\u00e4kee. Yleens\u00e4 sekoitus HTML-, CSS-, Ruby- sek\u00e4 JavaScript-koodia<\/li>\n\n\n\n<li><strong>Controller (ohjain) <\/strong>vastaa k\u00e4ytt\u00e4j\u00e4n pyynt\u00f6ihin, eli siis reagoi siihen, mit\u00e4 k\u00e4ytt\u00e4j\u00e4 tekee ja toimii siis mallin ja k\u00e4ytt\u00e4j\u00e4n v\u00e4liss\u00e4<\/li>\n<\/ul>\n\n\n\n<p>Koen, ett\u00e4 Ruby on Railssin yksinkertaiset mutta lyhyet koodip\u00e4tk\u00e4t ovat kauniita tehokkuudessaan.<\/p>\n\n\n\n<p>Nappaan t\u00e4h\u00e4n koodip\u00e4tk\u00e4n Hanssonin omasta <em>The Rails Doctrine<\/em> \u2013\u201dmanifestistaan\u201d:<\/p>\n\n\n\n<p>class Project &lt; ApplicationRecord<\/p>\n\n\n\n<p>    belongs_to :account<\/p>\n\n\n\n<p>    has_many :participants, class_name: &#8217;Person&#8217;<\/p>\n\n\n\n<p>    validates_presence_of :name<\/p>\n\n\n\n<p>end<\/p>\n\n\n\n<p><strong>Yksinkertaista! Upeaa! Mit\u00e4 t\u00e4ss\u00e4 siis tapahtuu?<\/strong> T\u00e4ss\u00e4 siis m\u00e4\u00e4ritell\u00e4\u00e4n Projekti-luokka Project, joka toimii siis t\u00e4ss\u00e4 modelina:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se kuuluu (belongs_to) tilille (account). RoR huomaa automattisesti, ett\u00e4 t\u00e4llainen relaatio on m\u00e4\u00e4ritetty, eli jos projektilla on account_id-attribuutti, voidaan tilin tietoja saada suoraan projektista kutsumalla project.account. Jos m\u00e4\u00e4ritelm\u00e4\u00e4 ei olisi, kutsu olisi raskaampi ja pidempi Account.find(project.account_id)<\/li>\n\n\n\n<li>Sill\u00e4 on monta (has_many) osallistujaa (participant). T\u00e4m\u00e4 tarkoittaa sit\u00e4, ett\u00e4 osallistujilla on project_id attribuutti ja osallistujat saa suoraan projektista kutsumallla project.participants. M\u00e4\u00e4ritelm\u00e4 asettaa luokasta Person (henkil\u00f6) henkil\u00f6it\u00e4 nimelle participants. Eli k\u00e4yt\u00e4nn\u00f6ss\u00e4 kutsulla project.participants saamme listan henkil\u00f6it\u00e4, joilla on relaatio tiliin sen sijaan, ett\u00e4 pit\u00e4isi tehd\u00e4 raskaampi ja vaikeammin luettava Person.where(project_id: project.id)<\/li>\n\n\n\n<li>\u00a0Lis\u00e4ksi projektia luodessa varmistetaan, ett\u00e4 nimi (name) on olemassa (validates_presence_of).\u00a0 Jos nimi ei ole olemassa projektia luodessa, tulee virheilmoitus: \u201dNime\u00e4 ei olemassa!\u201d<\/li>\n<\/ul>\n\n\n\n<p>Eli kunhan seuraa konventioita, lyhyell\u00e4 ja tehokkaalla m\u00e4\u00e4ritelm\u00e4ll\u00e4 saamme paljon aikaiseksi. Rails tekee taustalla paljon, mik\u00e4 tekee RoR:ll\u00e4 ohjelmoinnista tehokasta ja nopeaa.<\/p>\n\n\n\n<p>Ensimm\u00e4inen kokemukseni ohjelmistokehyksist\u00e4 oli Pythonin Djangolla edellisess\u00e4 ty\u00f6paikassa, jossa kehitimme laskutus- ja tilinpitoj\u00e4rjestelm\u00e4\u00e4 sek\u00e4 firmansis\u00e4ist\u00e4 myyntij\u00e4rjestelm\u00e4\u00e4. <strong>Python<\/strong> on kielen\u00e4 hajuttomampi ja mauttomampi, kuin Ruby. Se toimii, mutta on hieman vaikeammin luettavaa muun muassa siksi, ett\u00e4 eri kooditasot erotetaan toisistaan sisennyksill\u00e4, kun taas<strong> Rubyssa<\/strong> on selke\u00e4 <strong>Start \u2013 End -erottelut<\/strong> (esimerkiksi yll\u00e4 koodiesimerkiss\u00e4 class \u2013 end, eli luokan m\u00e4\u00e4rittely alkaa kohdassa class\u2026 ja m\u00e4\u00e4rittely loppuu kohdassa end). Toisaalta Pythonissa on laajemmat kirjastot, mutta Ruby on Rails voittaa siin\u00e4kin siksi, ett\u00e4 RoR:n kirjastot ovat tarkemmin nimenomaan nettikehityst\u00e4 kehyksen avulla tekemist\u00e4 varten. Toki Pythonilla on oma paikkansa. Sanoisin, ett\u00e4 t\u00e4ll\u00e4 hetkell\u00e4 data-analytiikan ja teko\u00e4lyjen kannalta Python on ohjelmistokielten aatelia. Toki t\u00e4ss\u00e4 j\u00e4\u00e4 Django-ohjelmistokehys kokonaan pois laskuista, ja <strong>ohjelmistokehysten kuningas on, ainakin mielest\u00e4ni, Ruby on Rails.<\/strong><\/p>\n\n\n\n<p>Suurin osa meid\u00e4n projekteistamme t\u00e4ll\u00e4 hetkell\u00e4 on nimenomaan r\u00e4\u00e4t\u00e4l\u00f6ityj\u00e4 nettisivuratkaisuja tai internetin v\u00e4lityksell\u00e4 toimivia sovelluksia, joihin Ruby on Rails sopii, kuin nen\u00e4 p\u00e4\u00e4h\u00e4n. <strong>Miksi se sitten ei ole nyky\u00e4\u00e4n en\u00e4\u00e4 niin suosittu?<\/strong> Noh. Ensinn\u00e4kin RoR on edelleen laaja-alaisesti k\u00e4yt\u00f6ss\u00e4 monessa eri paikassa ja monella eri alalla. Esimerkiksi<strong> Fiverr, AirBnB, Twitch sek\u00e4 GitHub <\/strong>k\u00e4ytt\u00e4v\u00e4t applikaatioissaan Ruby on Railssia. Lis\u00e4ksi uusia p\u00e4ivityksi\u00e4 julkaistaan edelleen ja kirjastoja sek\u00e4 p\u00e4ivitet\u00e4\u00e4n ett\u00e4 luodaan uusia jatkuvasti. Eli vaikka se ei ole yht\u00e4 suosittu kuin ennen, RoR ei suinkaan ole kuolemassa pois. Kuitenkin k\u00e4ytt\u00e4j\u00e4m\u00e4\u00e4riss\u00e4 on n\u00e4kyviss\u00e4 selke\u00e4\u00e4 laskua, mik\u00e4 selittyy osin sill\u00e4, ett\u00e4 RoR:n rinnalle on tullut paljon uusia vaihtoehtoja. Vaikka uudet vaihtoehdot eiv\u00e4t ole v\u00e4ltt\u00e4m\u00e4tt\u00e4 parempia, uutuuden vieh\u00e4tys ajaa k\u00e4ytt\u00e4m\u00e4\u00e4n uusinta uutta.<\/p>\n\n\n\n<p>RoR oli ensimm\u00e4isi\u00e4 ohjelmistokehyksi\u00e4, joka oli hyvin kaikenkattava ja on edelleen yksi kattavimmista kehyksist\u00e4. T\u00e4m\u00e4 johtuu osin my\u00f6s siit\u00e4, ett\u00e4 koska Ruby on Railssilla on <strong>vankka historia, kirjastot ovat laajoja ja hyvin tarkennettuja<\/strong>. Er\u00e4s asia, joka ajoi devaajia pois RoR:n parista oli RoR:n kehitys mikropalveluita kohti. Mikropalvelut, eli sovellusohjelman jakaminen pienempiin osiin, eiv\u00e4t olleet asia, joka sopisi hirve\u00e4n hyvin Ruby on Railssiin. My\u00f6s harhakuvat siit\u00e4, ett\u00e4 RoR olisi merkitt\u00e4v\u00e4sti hitaampi, kuin muut ohjelmistokehykset. T\u00e4m\u00e4 kuitenkaan ei pid\u00e4 paikkaansa ja juontaa juurensa toisaalta siit\u00e4, ett\u00e4 aloittelijan on todella helppo tehd\u00e4 tietokantahauista niin kutsuttuja 1 + n -hakuja ja toisaalta siit\u00e4, ett\u00e4 devaajia siirtyi Javasta, joka on k\u00e4\u00e4nnett\u00e4v\u00e4 (complied) kieli, Rubyyn, joka on tulkittava (interpreted) kieli. Nyrkkis\u00e4\u00e4nt\u00f6n\u00e4 k\u00e4\u00e4nnett\u00e4v\u00e4t kielet ovat nopeampia ajaa, kuin tulkittavat. 1 + n -haut ovat hakuja, joissa yhden haun sijaan tehd\u00e4\u00e4n yhden haun lis\u00e4ksi haussa haettujen olioiden verran hakuja. Eli aikaisemman esimerkin pohjalta, jos haemme yht\u00e4 tili\u00e4, jolla on 100 projektia, voisimme hakea kaikki kerralla yhdell\u00e4 haulla tai sitten tehd\u00e4 1 + n -haun, jossa ensin haemme tilin ja sen j\u00e4lkeen yksi kerrallaan projektit. Ja usein olioita on paljon enemm\u00e4n, kuin 100.<\/p>\n\n\n\n<p>Olen nauttinut Ruby on Railssin parissa ty\u00f6skentelyst\u00e4 jopa tilanteissa, joissa RoR:n front vaihdetaan Reactiin (mik\u00e4 yhdess\u00e4 projektissa on tapahtunut). Se on helppoa, sill\u00e4 se miksi eri asioita laitetaan tiettyihin paikkoihin, on<strong> loogista<\/strong>.Se on<strong> hauskaa<\/strong>,sill\u00e4 sit\u00e4 on helppo lukea ja tyydytt\u00e4v\u00e4\u00e4 kirjoittaa.Se on my\u00f6s <strong>tehokasta<\/strong>, koska sill\u00e4 saa aikaan nopeasti paljon verrattuna muihin kehyksiin. Suosittelen Ruby on Railssia kaikille v\u00e4hint\u00e4\u00e4n kokeilumieless\u00e4, mutta riippumatta siit\u00e4, mist\u00e4 l\u00e4ht\u00f6kohdista ryhtyy RoR-kehitykseen, t\u00e4ytyy muistaa, ett\u00e4 projektista tulee tehd\u00e4 Ruby on Rails -projektin n\u00e4k\u00f6inen.<\/p>\n\n\n\n<p><strong>Convention over Configuration!<\/strong> <\/p>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-ad2f72ca wp-block-group-is-layout-flex\">\n<p>&#8211; Leo       <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-rounded\"><img loading=\"lazy\" decoding=\"async\" width=\"102\" height=\"97\" src=\"https:\/\/www.pulmaton.fi\/wp-content\/uploads\/2026\/04\/Screenshot-2026-04-22-102508.png\" alt=\"\" class=\"wp-image-2879\" srcset=\"https:\/\/www.pulmaton.fi\/wp-content\/uploads\/2026\/04\/Screenshot-2026-04-22-102508.png 102w, https:\/\/www.pulmaton.fi\/wp-content\/uploads\/2026\/04\/Screenshot-2026-04-22-102508-13x12.png 13w\" sizes=\"auto, (max-width: 102px) 100vw, 102px\" \/><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Kun aloitin Pulmattomalla kes\u00e4ll\u00e4 2023, en ollut kuullutkaan Ruby on Railssista (RoR). Kuitenkin hyvin nopeasti t\u00f6it\u00e4 tekem\u00e4ll\u00e4 ja minulle kustannettua [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-2877","post","type-post","status-publish","format-standard","hentry","category-ajankohtaista"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/posts\/2877","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/comments?post=2877"}],"version-history":[{"count":5,"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/posts\/2877\/revisions"}],"predecessor-version":[{"id":2883,"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/posts\/2877\/revisions\/2883"}],"wp:attachment":[{"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/media?parent=2877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/categories?post=2877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pulmaton.fi\/en\/wp-json\/wp\/v2\/tags?post=2877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}