Relációs adatbázis rails alatt.
Filed under Rails
Most a relációs adatbázisok rejtelmeiről nem akarok írni, hisz remélem egy kis alapja mindenkinek van. Annyit röviden, hogy ugye vannak kapcsolatok, egy-egy, egy-több, több-több kapcsolatok. Vannak kulcsok, ezeket egymással összeköthetjük és máris van egy relációs adatbázisunk.
Railséknél minden ami adatbázis az ActiveRecord. A szabványos relációs adatbázisoknál vagy természetes illesztést csinálunk(megmondjuk melyik mező melyikkel egyenlő), vagy a private keyhez kapcsolunk egy foreign keyt. DHH szerint erre nincs szükségünk, mert ha railsnél csinálunk két táblát(movie, author), akkor elég megadnunk a review táblában a movie tábla id mezőjének nevét a következő formában (tábla név egyes számban)_id a példában movie_id.
Egy-egy kapcsolat
Generáljunk két modellt (vagy adjuk hozzá a már meglévőkhöz a szükséges mezőket):
Movie(cim:string), Author(movie_id:integer, author_name:string)
migrate
Majd adjunk hozzá egy-két teszt értéket a táblákhoz.
Mivel még sem adatbázis oldalon nem mondtuk, hogy mi mihez csatlakozik, sem rails oldalon, ezért szükségünk lesz valamire amivel megmondjuk mi mihez csatlakozik.
Mindig van egy függőség az egyik tábla felöl, ez jelenleg a author tábla, tehát ebbe a modelbe kell beszúrnunk, azt hogy ez függ, a movie táblátol. Ezt a következő módon tudjuk csinálni: belongs_to :movie. Mivel, hogy egy-egy kapcsolatról beszélünk, ezért a movie táblának van egy “származéka” ezt a has_one :author sorral tudjuk érvényesíteni.
Ennyi, meg is adtuk, hogy mi mihez hogyan, tehát már relációban vannak a tábláink. Most már csak az a kérdés, hogy kell ezeket használni? Teljesen szimpla pont szintaktikával letudjuk kezelni a dolgokat mind a két irányból.
Nézzük először a Movie tábla felöl.
m = Movie.find :first #kérdezzük le hozzá az author nevét m.author.author_name #Másik oldalról a = Author.find :first a.movie.cim a.movie = m #kapcsolat létrehozása a.build_movie(:cim=>”Star wars”) #kacsolat létrehozása egy új film hozzáadásaával a.save #buildnél mindíg kell save a.create_movie(:cim=>”Star wars”) #ilyenkor automatikus save van.
Egy-több, több-több kapcsolat
Ugye itt van egy szülő és ennek sok gyereke lehet, létrehozásnál egy különbség van, hogy a szülőnl a has_one, helyett has_manyt kell használni. pl has_many :reviews.
Itt is ugyanúgy működik a pont szintaktika, csak ne felejtsük el, hogy ha a szülőtől indítjuk, akkor ugye egy collectionként kell kezelni a lekérdezés eredményét, az az m.reviews egy object tömböt fog visszaadni, még akkor is ha ez a tömb egy elemű, tehát ha én kérném a m.reviews.id-t akkor itt egy object_idt fogok kapni. Tehát ehhez vagy meg kell adni konkrétan az elem elhelyezkedését, vagy egy cikluson kell végig futtatni az egészet.
Több-több kapcsolatnál ugye van egy join táblánk ezt létre kell hozni, a megfelelő külső kulcsokkal és ugye ebben két függőség lesz a két szülő fele. A szülőknél pedig meg kell adni, hogy has_and_belongs_to_many :egyik, has_and_belongs_to_many :másik.
Egykét varázsszó ami még hasznos lehet:
has_many :join has_many :valami, :though => :join has_many :valami, :dependent => :destroy #destoynál a gyerek elem ide tartozó részeit is törli has_many :valami, :dependent => :delete #gyorsabb a destroynál, de elveszítjük a filterek rugalmasságát has_many :valami, :dependent => :nullify #”bontja a kapcsolatot”
Van itt még sok okosság, de úgy gondolom, hogy azokat már mindenki maga megtudja nézni, ha szükséges lesz nekik:
- egyedi asszociációk
- rekurzív kapcsolat
- named scopes
dec27











szeptember 25, 2009 at 6:51 du.
cazatixow…
lil wayne new tattoos …
február 2, 2010 at 3:58 du.
Szia!
Gratulálok az írásaidhoz, követem a blogod, én is most ismerkedem RoR-el. Majd belinkelem az első appjaim amint elkészültek.
június 17, 2011 at 8:24 de.
Köszi, sokat segített!