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
żeby dowiedzieć się w jakich dniach pracownik pracuje w danym miejscu, trzeba będzie niepotrzebne JOINy robić
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?
[quote=tomalec]Hej,
dopiero zaczynam zabawę z RoRem i mam taki problem,
(…)[/quote]
Najpierw całe ActiveRecord::Associations do przeczytania - 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
ż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?
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
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
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ć.