Mam przykładowo model Program, który posiada relację wiele do wielu z modelem Programmer (metoda throught) oraz drugą relację wiele do wielu z modelem Tester (metoda throught). W obu tych dodatkowych modelach ProgramsProgrammer oraz ProgramsTester posiadam dodatkową kolumnę position, dzięki której chciałbym ustawiać kolejność (sortować). W jaki sposób połączyć modele Program z Programmer oraz Program i Tester, tak aby wyniki były przedstawione w jednym zapytaniu oraz mógłbym sortować te wyniki za pomocą kolumn position (wspomnianych powyżej)? Czy konieczne jest tutaj użycie metody find_by_sql (w czystym SQL-u potrafiłbym to napisać), czy da się to napisać bezpośrednio w Rails’ach? Próbowałem to zrobić tak:
I tutaj nie wiem w jaki sposób połączyć @programmers z @testers.
EDIT:
Jeszcze myślałem nad takim rozwiązaniem: modele Program, Programmer oraz Tester mają releację wiele do wielu z modelem Development. Czy takie rozwiązanie będzie lepsze tzn. bardziej optymalne? Jeżeli byłby taki układ tabel to jak uzyskać w jednym poleceniu wyniki zawierające zarówno dane z tabel programs, programmers i testers oraz uwzględnić sortowanie po kolumnie position z tabeli developments?
To był tylko przykład. Rozwiązanie, które podałeś jest fajne, ale niestety nie sprawdzi się w mojej aplikacji - mam w tych modelach różne pola.
Powiedzmy, że mam to 1 rozwiązanie, czyli modele Program, Tester, Programmer oraz ProgramsTester i ProgramsProgrammer. Czy jest jakaś metoda, która umożliwiałaby, aby w wyniku otrzymać obiekty klasy Programmer i Tester posortowane wg pól position znajdujące się w ProgramsTester, ProgramsProgrammer?
EDIT:
Już sobie poradziłem - skorzystałem z polimorficznych asocjacji.
A jednak pojawił się problem przy implementacji formularza. Tak wygląda mój przykład:
class Page < ActiveRecord::Base
has_many :contents
has_many :components, through: :contents
end
class Content < ActiveRecord::Base
default_scope { order(:position) }
belongs_to :page
belongs_to :component
belongs_to :resource, polymorphic: true
end
class Component < ActiveRecord::Base
has_many :contents
has_many :pages, through: :contents
has_many :descriptions, through: :contents, source: :resource, source_type: "Description"
end
class Description < ActiveRecord::Base
has_many :contents, as: :resource
has_many :pages, through: :contents
end
Czyli strona może mieć wiele treści i komponentów; komponent może występować na wielu stronach, ale może też mieć wiele treści; z kolei description jest jednym z komponentów (może być ich więcej o różnej strukturze tabeli, dlatego zastosowałem polimorficzne powiązanie) i może występować w wielu treściach i stronach. A content zawiera całą zawartość strony z odwołaniem do id strony, id komponentu i id treści komponentu (tutaj description, ale może to też być zupełnie co innego).
Chciałem podczas edycji strony zrobić coś na podobę tego. Czyli w tym select’ie grupami byłyby nazwy komponentów, a treścią zaznaczone odpowiednie treści z tych komponentów. Próbowałem to zrobić, ale problemem okazało się to, że musiałbym dla każdego komponentu odwoływać się do wielu obiektów (tzn. description i innych w przyszłości). Czy przy takiej strukturze tabel jest to w ogóle wykonalne? Czy trzeba zmienić strukturę tabel? Proszę o radę w jaki sposób mógłbym zaimplementować ten select lub zmienić strukturę tabel tak, aby było to możliwe.