Dwie relacje wiele do wielu do jednego modelu i wynik

Witam,

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:

@program = Program.first
@programmers = @program.programmers
@testers = @program.testers

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?

Pozdrawiam,
brando.

Po nazwach Tester i Programmer wnioskuję, że to User ale o konkretnej roli. Jeżeli różnice w tych modelach nie są znaczące (te same pola) i polegają głównie na innych metodach to może warto skorzystać z STI:
http://samurails.com/tutorial/single-table-inheritance-with-rails-4-part-1/

Wtedy będzie można bezpośrednio zapytania wykonywać z modelu User jako zbiorcze oraz nie powielać tabel w bazie :wink:

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.

EDIT:

Znalazłem częściowe rozwiązanie problemu -> http://stefan.haflidason.com/simpler-polymorphic-selects-in-rails-4-with-global-id/ Częściowe dlatego, że zamiast nazw komponentów wyświetlają mi się nazwy modeli. Czy jest jakiś sposób, aby wyświetlać zamiast nazwy modelu nazwę komponentu z tabeli components?

Pozdrawiam,
brando.