Model posiadajacy wiele relacji has_many

zalozmy ze mamy klase Color i ten model moze ma wiele modeli powiazanych za pomoca relacji has_many i belongs_to

przykladowo

[code]class Color < ActiveRecord::Base
has_many :greens
has_many :reds
has_many :oranges
has_many :purples
has_many :yellows

class Green < ActiveRecord::Base
belongs_to :colors

class Red < ActiveRecord::Base
belongs_to :colors
…[/code]
Czy sa jakies przeciwwskazania co do np. wygody uzytkowania, wydajnosci czy czegokolowiek innego, czy spokojnie mozna takiej konstrukcji uzywac ?

myślę że śmiało możesz używać takich konstrukcji, tylko po belongs_to pamiętaj o liczbie pojedynczej belongs_to:color

Zalezy do czego, pomysł z kolorami mi się nie kompiluje :stuck_out_tongue:
Jeżeli te relacje odwzorowują rzeczywiste modele z domeny to czemu nie?

z kolorami to byl tylko przyklad taki :slight_smile: chodzilo mi czy duzo has_many nie obciazy bardzo bazy, ale z tego co mi sie wydaje po zaladowaniu jednego Modelu klasy kolor pozostale skladowe obiekty sa ladowane dynamicznie (wiec i polaczenie z baza dopiero wtedy sie odbywa) dopiero przy odwolaniu, mam racje ?

tak, składowe są ładowane w razie potrzeby, używa się parametru :include metody find, aby załadowac w jednym zapytaniu podmodele.

Pozwolę sobie jednak wysunąć pewne wątpliwości - czy faktycznie potrzebujesz klas takich jak “Red”, “Blue”, etc.
Wyglądają mi one zdecydowanie na instancje klasy kolor, a nie jej podklasy. Czy każdy z kolorów będzie miał inną funkcjonalność?
Szczerze w to wątpię. Z pewnością mogą różnić się wartościami atrybutów (np. heksadecymalny zapis koloru w palecie RGB), ale nie sądzę by miały metody o odmiennej implementacji.
Nie daj Boże, jeśli chodzi Ci o sytuację, w które kolor ma być wybierany np. w polu select - tutaj zdecydowanie nie powinno się tworzyć odrębnych klas. Żeby dodać nowy kolor, będziesz musiał zmieniać kod! A przecież spokojnie mogłoby to być robione przez interfejs administratora. Oczywiście jest to tylko praktyczny problem, który wynika z niewłaściwego modelu.
Rzuć okiem na moje notatki dot. modelowania konceptualnego (w szczególności punkt dot. relacji “isa”) oraz
obiektowości w Rubim w (szczególności podpunkt “dziedziczenie”).
Zastanów się dobrze, czy właściwie wykorzystujesz ten mechanizm.

Faktycznie przykład z kolorami przedstawiony przez mojego imiennika jest niezbyt fortunny - w przypadku klasy Color zapisywałbym osobne składowe RGB w wartościach integer i wszystko by było cacy.

Arturowi chodziło tylko o to, czy przy dużej ilości relacji has_many w modelu nie będzie przeciążona baza danych. Nie zawsze trzeba zaglądać do podmodeli. I domyślnie tak się nie dzieje. Aby wymusić pobranie podmodeli trzeba użyć parametru :include.

@apohllo: A notatki Twoje o modelowaniu zostały dodane do ulubionych

Dlatego nawet przykłady powinno się pisać takie, żeby były sensowne i nie wzbudzały podejrzeń :wink:

rzeczywiście przykład trochę niefortunny :slight_smile: dzięki za notatki

Tak przy okazji dopiero teraz zauważyłem, że tam nie ma relacji dziedziczenia, tylko jeden-do-wielu :slight_smile: Ale skoro się przydało, to dobrze :slight_smile:

Zainteresowala mnie ta relacja ISA która wskazales, w tym przykladzie “Planeta”, “Cialo niebieskie”, “Gwiazda” i “Ksiezyc” w przelozeniu na baze danych to beda poprostu tabele ?
Jak w tym przykladzie, w bazie danych, bedzie wygladac w praktyce np Ziemia która jest zarowno planeta jak i cialem niebieskim ?

szystko bym wpakował do jednej tabeli ciała niebieskie. W Rails tworzysz dziedziczące modele właśnie. (kolumna type)

znaczy sie, uzywajac has_many ?

pierwsze to polymorphic association a drugie to single table inheritance

jak by to wygladalo w przelozeniu na te planety ?

Masz model CiałaNiebieskie, który ma pola: masa, średnica.
Model dziedziczący z niego to Planeta, ma pole dodatkowo jeszcze: zamieszkana
Inny model dziedziczący z CiałaNiebieskiego to Gwiazda, która ma pole dodatkowe: Jasność
Od strony technicznej wygląda to tak, że masz tabelę ciała_niebieskie, gdzie masz kolumny: masa, srednica, zamieszkana, jasnosc, type. Gdzie type określa typ dziecka CiałaNiebieskiego.
Tak to działa w STI(Single Table Inheritance).
Graficzne przedstawienie: http://martinfowler.com/eaaCatalog/singleTableInheritance.html

Post napisany przed dorzuceniem obrazka :stuck_out_tongue:
A z tym krążeniem jeszcze, to nie wiem. Trzeba by było się zastanowić, ale to chyba jest has_one/belongs_to pomiędzy nimi jeszcze. Co jest możliwe jak najbardziej.

A może model CialaNiebiskie i model Parametry.
W Ciala niebeiskie masz:

1 | Nazwa | Gwiazda | Masa | Tempetratura
2 | Nazwa2 | Księżyc | Masa2 | Tmp2

a w parametry masz:

1 | 1 | Parametr_a | Wartosc_a
2 | 1 | Parametr_b | Wartosc_b
3 | 2 | Parametr_c | Wartosć_x

itd.

Pozdrawiam

to ostatnie ma spora wade ze pola musialy by byc tego samego typu, czyli pewnie String, String

parametr moze byc liczba i brany z innej tabeli, w koncu nie bedzie ich 1000 tylko kilka/kilkanaście a wartość będzie stringiem, choć zależy co tam będzie trzymane cho widze ze promien jasnosc to moze byc integer.

ciala nioebieskie
1 | Nazwa | Gwiazda | Masa | Tempetratura
2 | Nazwa2 | Księżyc | Masa2 | Tmp2

Parametry
1 | masa
2 | jasność

a w parametry_ciała masz:

id| ciało | parametr | wartosc
1 | 1 | 1 | 3454
2 | 1 | 2 | 34534
3 | 2 | 1 | 10000

Jak za jakis czas zechcesz dodac ilość osob zamieszkujacych dana planete to ro parametry dajesz
3 | ludnośc

a w parametry_ciała masz:

id| ciało | parametr | wartosc
4 | 1 | 3 | 12

Relacja Ksiezyc >|— Planeta to chyba nie ma co kombinowac i poprostu bylo by has_many, belongs_to jak Yax napisal. has_many bo planeta moze miec wiele ksiezyców, jak widac na wykresie