2011-08-08 9 views
9

W przypadku aplikacji CRM chcę mieć możliwość powiązania modelu Person bezpośrednio z modelem konta lub z modelem firmy, który z kolei jest powiązany z modelem konta. Ponadto chcę powiązać model adresu z firmą lub osobą. To, co mam na myśli:Model szyn należy do jednego lub drugiego modelu

class Account 
    has_many :Persons 
    has_many :Companies 
end 

class Person 
    belongs_to :Account 
    belongs_to :Company 
    has_one :Address 
end 

class Company 
    belongs_to :Account 
    has_many :Persons 
    has_one :Address 
end 

class Address 
    belongs_to :Person 
    belongs_to :Company 
end 

Więc Konto będzie albo „konto osoba” lub „konto firmowe” w zależności od stowarzyszenia być. Będą się wzajemnie wykluczać. Planuję mieć klucze obce account_id i company_id w tabeli Person. Z tego samego powodu miałbym klucze obce person_id i company_id w tabeli Address. Jeden klucz obcy w każdym przypadku byłby zerowy.

Czy to jest w porządku w Railsach? Jeśli nie, wszelkie zalecenia będą mile widziane.

+0

można używać walidacji modelu, aby upewnić się, że tylko jeden rodzaj związku istnieje. Nie jestem pewien, na czym polega większa odpowiedź ... – jaydel

Odpowiedz

8

Spójrz na stowarzyszenia polimorficzne. Myślę, że to, czego szukasz: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

class Account 
    belongs_to :User, :polymorphic => true 
end 

class Person 
    belongs_to :Account, :as => :User 
    belongs_to :Company 
    has_one :Address, :as => :User 
end 

class Company 
    belongs_to :Account, :as => :User 
    belongs_to :Persons 
    has_one :Address, :as => :User 
end 

class Address 
    belongs_to :User, :polymorphic => true 
end 
... 

pozdrowienia Sven

+2

Dzięki Sven! Dokładnie tego potrzebowałem. Przeczytaj o Stowarzyszeniach polimorficznych w "The Rails 3 Way". Doceniam twoją pomoc. –

Powiązane problemy