2011-01-21 16 views
1

だから私は連絡先データを管理するためのレールアプリケーションを書いています。Rails多対多の同じクラスの双方向関係..どのように?

私は連絡先モデルを持っており、その連絡先には多くの家族がいる必要があります関連する関係データ..

ContactA | ContactB | Relationship 
1   2   Contact A is Contact B's Father 

がどのように私は同じクラスの2つのオブジェクトを関連付けると、いくつかのデータを添付し、そのように双方向TE関係をトラバースすることができ、すなわち:

@guy1 = Contact.find(1) #Guy A 
@guy1.family_relationships 
>>> [[guyb, "f"], [guyc, "s"]] 
@guy2 = @guy1.family_members.first 
@guy1.family_members 
>>> [[guya]] 

厥おそらくない100%正しいbuその後半とiveは一日中サーバーと戦っていたので、私を許してください!

私は..あなたがそれを行うためにハックSQLのすべての種類をしなければならない

感謝を聞きました!

ダニエル

+0

モデルに関する質問では、モデル間の関係が正確にわかるように構造を示す必要があります。いずれの場合でも、あなたが表示する例は奇妙です。 – tokland

+0

こんにちは@tokland ..ちょっと単純な家族関係、つまり人が家族を持っていて、その家族が兄弟や父親や母親などになる可能性があります。モデル、私はちょうど私がお互いに多くの人々を関連付けることができ、関係にいくつかのデータを添付することを知りたい、つまり彼は彼の父であるために関連付けられています。 –

+0

[この質問に近い](http://stackoverflow.com/questions/4275567/how-do-you-handle-side-effect-of-duplication-when-using-joins-tables-ie-recip/4277993 #4277993)最初にそれを読むことができます。 – edgerunner

答えて

2

以前の私のプロジェクトでも同様の状況でした。私は次のデザインで行った:

class Patient < AR::Base 
    has_many :relatives, :dependent => :destroy do 
    def husband 
     select { |r| r.relation.eql?('Husband').first 
    end 

    def father 
     select { |r| r.relation.eql?('Father').first 
    end 

    ... 

    def sons 
     select { |r| r.relation.eql?('Son') 
    end 
    ... 
    end 
end 

class Relative < AR::Base 
    belongs_to :patient 

    validates :relation, 
    :inclusion => { 
     :in => %w(Husband Daughter Son Father Mother Brother Sister) 
    } 
end 

これは私のために働いています。これがあなたを助けたり、少なくともあなたが正しい方向を向いてくれることを願っています!

+0

ありがとう@サムは役に立ちました! –

関連する問題