Wielowymiarowy klucz obcy

Hej,
dopiero zaczynam zabawę z RoRem i mam taki problem,

przydałoby mi się coś w stylu:

class Schedule < ActiveRecord::Base belongs_to :employment :foreign_key=>[:employee_id, :place_id] belongs_to :employee belongs_to :place end
albo co najmniej:

class Schedule < ActiveRecord::Base belongs_to :employee, :through=>:employment belongs_to :place, :through=>:employment end
Oczywiście, można to zakodować, tak:

class Schedule < ActiveRecord::Base belongs_to :employment :foreign_key=>:employement_id end
Ale wtedy

  1. żeby dowiedzieć się w jakich dniach pracownik pracuje w danym miejscu, trzeba będzie niepotrzebne JOINy robić
  2. Każdorazowe dobieranie się przez emplyments jest mało wygodne
    2.1. a nawet przy

class Employee < ActiveRecord::Base has_many :schedules, :through=>:employment end
trzeba robić jakieś dzikie warunki, żeby mieść Schedule dla np. place_id=1
3. nie wiem czy łatwo będzie zmapować zagnieżdżony zasób schedules

Mam nadzieję, że po prostu o czymś nie mam pojęcia, i sprawa jest łatwa i przyjemna :),
mógłby ktoś pomóc?

poszukaj czegoś o “polymorphic associations”

Nie bardzo widzę, co miałoby tu być polymorphic?

[quote=tomalec]Hej,
dopiero zaczynam zabawę z RoRem i mam taki problem,
(…)[/quote]
Najpierw całe ActiveRecord::Associations do przeczytania :stuck_out_tongue: - zobacz przede wszystkim gdzie, jak i kiedy możesz stosować has_many, belongs_to oraz parametr :through (podpowiedź: na pewno nie do belongs_to – ale to właśnie wymaga zrozumienia idei asocjacji has_many :through).

Potem: jeśli już trzeba wybierać z tych dwóch struktur, to zdecydowanie ta druga (z pełnoprawnym kluczem głównym). Sam zresztą już chyba widzisz, że o wiele łatwiej robić asocjacje z takim pełnprawnym modelem złączeniowym.

[quote=tomalec]Ale wtedy

  1. żeby dowiedzieć się w jakich dniach pracownik pracuje w danym miejscu, trzeba będzie niepotrzebne JOINy robić[/quote]
    To oznacza, że:
    a) projekt struktury tych tabel (tej grupy tabel) jest zły i nie odpowiada wymaganiom biznesowym
    lub
    b) niepotrzebnie przejmuje się JOINami - ActiveRecord zrobi je za Ciebie, jeśli sensownie zdefiniujesz asocjacje

Którą odpowiedź wybierasz? :wink:

Jest bardzo wygodne, ponieważ ActiveRecord::Base.find pozwala podawać zagnieżdżone (za pomocą hashy) warunki w :conditions
Na przykład: Schedule.find(:all, :conditions => {:employment => {:employee => {:name => “Kazio”}}})

Scieżki do zasobów zawsze jest łatwo zmapować. Pamiętaj że zasób - i to jak go sobie zdefiniujesz (tj. jak silne będzie miał powiązanie z modelem bazodanowym) - to warstwa kontrolera i tylko na jego etapie powinieneś się tym martwić.

[quote=tomalec]Mam nadzieję, że po prostu o czymś nie mam pojęcia, i sprawa jest łatwa i przyjemna :),
mógłby ktoś pomóc?[/quote]
Jeśli pierwsza linijka, po wykonaniu, nie pomogła do końca, pogooglaj za “has_many :through” - przewałkowano ten temat już milion razy :slight_smile:

źle Cię zrozumiałem :slight_smile:

:]
Dzięki, w sumie już nie ma zmartwienia :slight_smile:

ActiveRecord::Associations poczytałem i właśnie brakowało mi w belongs_to. O has_many :through googluję cały dzień, ale widać nigdy dość.

Napisanie app o tej drugiej strukturze, zdecydowanie pomogło i rzeczywiście wcale nie takie straszne; czas chyba zacząć więcej pisać, mnie się przejmować.

1.b) dla mnie bomba!
2. o tych hashach google mi nie powiedział, dzięki

No i w ogóle dzięki za błyskawiczną odpowiedź :slight_smile:

No to jeszcze do poczytania masz http://www.apohllo.pl/guides/association_basics.html - tam jest prawie wszystko o asocjacjach, w jednym miejscu i po polsku.

Mamy już sporo guidów przetłumaczonych, ale jeszcze muszę je przejrzeć, dlatego nie podawałem oficjalnej informacji, że można już zacząć z tego korzystać.