Самореференциальные отношения has_many и own_to - PullRequest
3 голосов
/ 26 января 2012

Я пытаюсь построить схему вокруг концепции компании.

Компания может иметь материнскую компанию (т. Е. Конгломерат).Компания также может иметь несколько дочерних компаний.Но компания также может быть автономной и не иметь ни дочерних компаний, ни материнской компании.У меня возникают проблемы, когда я пытаюсь смоделировать это с помощью 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, если оно равно нулю, я знаю, что в этой компании нет дочерних компаний.

Буду признателен за любую помощь в поиске правильного способа построить эти отношения!

Ответы [ 4 ]

1 голос
/ 26 января 2012

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

0 голосов
/ 14 декабря 2016

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

belongs_to :page, :inverse_of => :subpages
has_many :subpages, class_name: "Page",
                 foreign_key: "page_id", 
                 dependent: :destroy
0 голосов
/ 26 января 2012

Беглый взгляд на источник драгоценного кода act_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 в вашей таблице.Однако обратите внимание, что вам нужно будет реализовать методы, которые обходятся бесплатно в Gem_s_s_tree_s_tree_.Надеюсь, что это указывает на какое-то направление.

0 голосов
/ 26 января 2012

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

ОБНОВЛЕНИЕ

Я солгал ... неправильно прочитано.... новое редактирование за секунду

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...