2011-07-05 9 views
9

W ActiveRecord, has_many :through, and Polymorphic Associations Przykład OP, zażąda ignorując możliwie nadklasą Alien i Person(SentientBeing). To jest moje pytanie.ActiveRecord, has_many: przez polimorficzne Związki z STI

class Widget < ActiveRecord::Base 
    has_many :widget_groupings 

    has_many :people, :through => :widget_groupings, :source => :person, :source_type => 'Person' 
    has_many :aliens, :through => :widget_groupings, :source => :alien, :source_type => 'Alien' 
end 

SentientBeing < ActiveRecord::Base 
    has_many :widget_groupings, :as => grouper 
    has_many :widgets, :through => :widget_groupings 
end 


class Person < SentientBeing 
end 

class Alien < SentientBeing 
end 

W tym zmodyfikowanym przykładzie, wartość grouper_type do Alien i Person obecnie zarówno przechowywane w szynach w SentientBeing(szyny poszukuje podstawową klasę tej wartości grouper_type).

Jaki jest właściwy sposób modyfikacji has_many w Widget w celu filtrowania według typu w takim przypadku? Chcę być w stanie zrobić Widget.find(n).people i Widget.find(n).aliens, ale obecnie obie te metody (.people i .aliens) powrócić zbiór pusty [] ponieważ grouper_type jest zawsze SentientBeing.

+0

To pytanie jest bardzo podobne do tego [pisałem wcześniej] [1]. To interesujący problem, ponieważ, jak powiedziałeś, atrybut 'grouper_type' zapisuje tylko nadklasę. Wydaje się, że potrzebne jest połączenie między widżetami a tabelami sentient_beings. Bardziej długowieczna kwerenda, taka jak ta, której użyłbym prawdopodobnie zadziałałaby dla ciebie, ale nie jest ładna - stąd powód, dla którego zadałem moje pytanie. [1]: http://stackoverflow.com/questions/6582588/rails-structuring-a-query-vvolving-a-polymorphic-association-and-sti – JamesDS

+0

<3 anonimowe oddanie głosów. – deefour

Odpowiedz

13

Czy próbowałeś najprostszych rzeczy - dodając :conditions do has_many :through s?

Innymi słowy, coś takiego (w widget.rb):

has_many :people, :through => :widget_groupings, :conditions => { :type => 'Person' }, :source => :grouper, :source_type => 'SentientBeing' 
has_many :aliens, :through => :widget_groupings, :conditions => { :type => 'Alien' }, :source => :grouper, :source_type => 'SentientBeing' 

JamesDS jest prawdą, że sprzężenie jest potrzebna - ale nie jest napisane tutaj, ponieważ stowarzyszenie has_many :through już robi.

+0

Wielkie dzięki, tego właśnie szukałem. – deefour

Powiązane problemy