2012-01-25 21 views
2

私は会社のコンセプトに沿ってスキーマを構築しようとしています。自己参照has_manyとbelongs_toの関係

企業は、親会社(すなわち、大企業)を持つことができます。会社には複数の子会社もあることがあります。しかし、会社は独立型でも、子会社も親会社も持たない場合もあります。私は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 

理想的には、私はそれがnilであれば、company.subsidiariesをチェックできるようにしたいと思い、私はその会社は、子会社を持っていないことを知っている:ここでは、私が持っているものです。

この関係を構築する正しい方法を理解する助けがあれば、大変感謝しています。

答えて

1

ancestry gemの使用を妨げることはありますか?このようなツリー構造を非常によく扱い、ツリーを操作して操作するための多数のヘルパーメソッドを提供します。

+0

いや、私はそれを使用することができると思います。私はドキュメントを読んできましたが、これは良い解決策だと思われますが、追加の宝石を使用しない単純なソリューションがあるかどうかは疑問です。当分の間、私はあなたの提案を探求し続けるつもりです。 –

+0

私はこれをやったと思ったようにクイック検索をしましたが、その私の古い記憶!これが何か助けを与えるなら、私はacts_as_tree宝石を使いました。 –

+0

Andrew Lankによると、Railsのコアであったが、緊縮の動きの一環として宝石に移されたacts_as_treeもあります。バージョンロックされた宝石を使うことは安全な賭けです。 – 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するように設定されます。ただし、acts_as_tree宝石が無料で提供するメソッドを実装する必要があります。これが何らかの方向であなたを指してくれることを願っています。

0

これは私のソリューションです:

belongs_to :page, :inverse_of => :subpages 
has_many :subpages, class_name: "Page", 
       foreign_key: "page_id", 
       dependent: :destroy