2012-02-29 26 views
1

同じモデルを参照するアクティブレコード内にhasとhave many関係を持つことは可能ですか?HABTM自己との関係?

私は兄弟型の関係をモデル化したいと思います。

class Child < ActiveRecord::Base 
    has_and_belongs_to_many :siblings 
end 

これまでのところ、私が作成した兄弟は、テーブルリンクされています

class CreateSiblings < ActiveRecord::Migration 
    def change 
    create_table :siblings do |t| 
     t.integer :child1_id 
     t.integer :child2_id 
     t.timestamps 
    end 
    end 
end 

しかし、私は、これは実際のインスタンスで取得するために、醜いコードを書く私につながる恐れ:

siblings = [] 
child1.siblings.each do |s| 
    siblings << s.child2 
end 

私はずっと多くの子供たちを書いて、たくさんの子供を得ることができます:

child1.siblings 

これをサポートするために私のリンクテーブルとモデルの関連がどのように見えるのでしょうか?

私は本当に明白な何かを見逃しているように感じる。

私はRails 3.1です。助けてくれてありがとう!

+0

、兄弟姉妹は、parent.childrenマイナス実際の子供のように常にあります。他の機能や情報を追加しない限り、少なくとも。これが必要ですか? –

+0

残念ながらはい、Ekamppへの私のコメントを参照してください。私のモデルでは、子どもたちは法的な保護者を雇っています。おそらく彼らは兄弟と分かち合いません。 – Chris

答えて

4

方法1:

私は単にparent_idのようなものと呼ばれる列を追加します。

私はその後、モデル上のインスタンスメソッドを作るようなものでしょう:

def children 
    Model.where({ parent_id: id }) 
end 

そして、あなたが親をしたい場合は、あなたのような何かを行うことができます:

def parent 
    Model.where({ id: parent_id }).first 
end 

をそして、あなたはそれから収集することができますこのような兄弟:

def siblings 
    parent.children.reject{ |r| r == self } 
end 

方法2:

また、belongs_to関係を試みるようなものでした:

belongs_to :parent, class_name: "Model", foreign_key: :parent_id 

しかし、私はこの方法については、100パーセントわかりません。それが動作する前にちょっと微調整しなければならないかもしれません。

私はそれが役に立てば幸い:)

\\この余分なテーブルが不要なオーバーヘッド思わ一見私にようエミール

私の知る限り見るように
+0

残念なことに、このモデルは分割されたファミリをサポートしなければならないので、2人の兄弟が必ず共通の親を持つことを保証することはできません:( – Chris

+0

あなたは 'sibling_id'カラムでそれらをマークし、 – Ekampp

+0

この場合、各子は1つの兄弟に限定されませんか? – Chris

関連する問題