2012-01-25 3 views
2

Я пытаюсь построить схему вокруг концепции компании.Self-referential has_many и принадлежит_от отношениям

Компания может иметь материнскую компанию (то есть конгломерат). В компании также может быть несколько дочерних компаний. Но компания также может быть автономной и не имеет ни дочерних компаний, ни материнской компании. У меня возникли проблемы, обертывая голову вокруг того, как моделировать это с помощью ActiveRecord. Вот что у меня есть:

class Company < ActiveRecord::Base 
    validates_uniqueness_of :company_id 
    has_many :products 
    has_many :subsidiaries, :class_name => "Company", optional: true 
    belongs_to :parent_company, :class_name => "Company", optional: true 
end 

В идеале, я хотел бы быть в состоянии проверить company.subsidiaries, если она равна нулю, я знаю, что эта компания не имеет дочерних компаний.

Любая помощь в определении правильного пути построения этих отношений была бы очень признательна!

ответ

1

Есть ли что-нибудь, что помешало бы вам использовать ancestry gem? Он достаточно хорошо обрабатывает такие древовидные структуры и предоставляет большое количество вспомогательных методов для навигации и управления деревом.

+0

Нет, я думаю, что я могу использовать. Я читал документы и кажется, что это хорошее решение, но мне интересно, есть ли простое решение, которое не использует никаких дополнительных драгоценных камней. На данный момент я продолжу изучение вашего предложения. –

+0

Сделал быстрый поиск, поскольку я думал, что сделал это, но эта старая память! Я использовал action_as_tree gem, если это поможет. –

+0

Как говорит Эндрю Лэнк, есть также act_as_tree, который раньше был ядром Rails, но был перемещен в драгоценный камень как часть движения жесткой экономии. Использование драгоценного камня, защищенного версией, - это безопасная ставка. – tadman

0

Думайте больше вдоль линий has_many :through Это немного более динамичным для этого приложения http://blog.hasmanythrough.com/2007/10/30/self-referential-has-many-through

UPDATE

я лгал ... неправильно ... правка во втором

ОБНОВЛЕНИЕ ... СНОВА!

На самом деле, я просто переутомил его. Этот блог должен дать твердый рабочий пример. К сожалению, сейчас я работаю над дополнительными часами. Лишение сна заставит вас что-нибудь угадать

0

Беглый взгляд на источник acts_as_tree гем показывает отношения

belongs_to :parent, :class_name => name, :foreign_key => configuration[:foreign_key], :counter_cache => configuration[:counter_cache] 
has_many :children, :class_name => name, :foreign_key => configuration[:foreign_key], :order => configuration[:order], :dependent => :destroy 

где: foreign_key будет установлен parent_id в таблице. Просто имейте в виду, что вам нужно будет реализовать методы, которые предоставляет action_as_tree gem бесплатно. Надеюсь, это указывает на то, что вы в каком-то направлении.

0

Это мое решение:

belongs_to :page, :inverse_of => :subpages 
has_many :subpages, class_name: "Page", 
       foreign_key: "page_id", 
       dependent: :destroy 
Смежные вопросы