W nowym projekcie zdecydowałem się użyć Postgressa. Z tego co wiem ma on taki ciekawy feature jak table inheritance. Nadał by się on do mojego przypadku gdzie mam modele które mają część pól wspólnych.
Coś jak na tym tutorialu http://techspry.com/ruby_and_rails/multiple-table-inheritance-in-rails-3/ tyle że używając table inheritance Postgresowego.
W jaki sposób Railsy to wspierają i jak tworzyć migracje do tego ? Chyba że w migracji mam wstawić czysty sql ? Coś muszę dodać w modelach oprócz self.abstract_class = true dla modelu parent ?
Znalazłem też take gemy https://github.com/hzamani/acts_as_relation/ https://github.com/brunofrank/class-table-inheritance ale nie wiem czy jest sens ich używać bo podejrzewam że emulują one właśnie postgresowe table inheritance na poziomie active record.
Z tego co wiem, to nie ma wsparcia dla tego w railsach. Jak to testowałem, to tak jak mówisz, zamiast create_table wstawiłem execute SQL. Żeby nie trzeba było wszystkich pól samemu definiować, to można by spróbować zrobić pustą tabelę i później już normalnie z API migrations dodawać kolumny (jest chyba jakaś metoda, żeby to pogrupować).
Sprawdzę jeszcze później czy na pewno tego nie dodali np. w masterze. Mógłbyś też spróbować napisać prosty plugin, który rozszerza API migracji.
Ciekaw jestem czy trzeba pisać delegatory, czy model sam wszystkie pola z bazy rozpozna, nie tylko z tabeli głównej ale z tej po której dziedziczy.
Nie trzeba, bo railsy do wyciągnięcia kolumn używają tego kodu: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L1505-1514
Jak wykonasz to zapytanie na tabeli, która dziedziczy po innej tabeli, to dostaniesz wszystkie jej kolumny.
czyli wszystko działa tak jakbym używał jednej tabeli ? Tworzenie nowych rekordów itp ?
Tak, bo te tabele zachowują się tak jakby normalnie miały te wszystkie pola. Nie testowałem tego intensywnie, więc jakbyś napotkał jakieś problemy, to możesz wrzucić issue na githuba, ale nie powinno się nic wysypać.
zauważyłem taki problem że locale nie są dziedziczone dla formularza, w każdym razie dla simple_form, pola z tabeli nadrzędnej nie są tłumaczone
mea culpa, zapomniałem w modelu dać dziedziczenia po klasie nadrzędnej
Pamiętaj też o self.table_name = “tabela”, bo przy zwykłym STI masz wszystko w jednej tabeli, tutaj są oddzielne i bez tego wychodzą dziwne rzeczy.
Dzięki, rzeczywiście pasuje to dać dla tabeli nadrzędnej.
Czy to normalne że pgAdmin dla tabeli nadrzędnej pokazuje także te dziedzione kolumny ? Dodatkowo gdy podglądam w nim tą tabele dostaje ostrzeżenie że nie ma ona ustawionego primary id (jest ono ustawione w tabeli po której dziedziczy)
[quote=Artur79]Dzięki, rzeczywiście pasuje to dać dla tabeli nadrzędnej.
Czy to normalne że pgAdmin dla tabeli nadrzędnej pokazuje także te dziedzione kolumny ? Dodatkowo gdy podglądam w nim tą tabele dostaje ostrzeżenie że nie ma ona ustawionego primary id (jest ono ustawione w tabeli po której dziedziczy)[/quote]
Raczej błąd w pgAdmin. Nie używam pgAdmina, ale z tego co pamiętam, to tabela dziedzicząca nie powinna mieć primary key, bo go dziedziczy, tak samo tabela nadrzędna nie powinna widzięc pól tej podrzędnej.
Też mi się tak wydawało co do tego klucza.
Co do pozostałych kolumn to railsowe modele też w sumie widzą wszystkie pola, wiec nie jest to tak całkiem niepoprawne jakby się zastanowić, w schema.rb są wszystkie zarówno własne jak i dziedziczone
Jeszcze takie pytanie, czy da się jakoś sprawdzić dziedziczenie ale w góre ? Tzn mając obiekt parent pobrać child i będzie on odpowiedniej klasy, oczywiście nie lecąc po wszystkich klasach i nie sprawdzając. Chciałbym zrobić wspólny kontroler dla tych klas.
Nie chcesz, KISS.
A jeśli chcesz przez to przechodzić to: Class#inherited, ale nie wiem jak z automatycznym ładowaniem w railsach to zadziała