2011-09-14 10 views
2

私は、(友人、家族、隣人など)の一方向の関係を許可したい人物モデルを持っています。ある人物を別の人物の友人としてマークすると、お互いの友達。ActiveRecordの友人関係をモデル化する方法

id person_a_id person_b_id relationship_type 
-- ----------- ----------- -------------------- 
1  1   2   friend 
2  1   3   neighbor 

これは私に語っ何されています。これは、リレーションシップ・テーブルがどのように見えるかである私たちは、いくつかの人々のデータ(レコードID = 1,2,3,4,5)を持っていると仮定し

Class People 
    id 
    name 

Class Relationship 
    id 
    person_a_id 
    person_b_id 
    relationship_type 

、人1は友人(人2)と隣人(人3)を持っています。また、Person 2には友人(Person 1)があり、Person 3には隣人(Person 1)があることがわかります。

Self-Referential Associationでこれを行うことができると思いますが、よりクリーンな方法があると思います。私は何かを見逃していますか、そこに宝石があります、私のあらゆる必要を満たすために待っています(少なくともこの質問が出る限り)?または、私は1つを書く必要があります...

答えて

5

自己参照団体はここに行く方法です。

私の意見では、このトピックの最善のリソースはRailsCastです。

Userモデル(あなたのため人):

has_many :friendships 
has_many :friends, :through => :friendships 
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
has_many :inverse_friends, :through => :inverse_friendships, :source => :user 

友情モデル(あなたのための関係):

belongs_to :user 
belongs_to :friend, :class_name => "User" 
+0

自己参照 'にhas_many:through'は確かに行く方法です。 – meagar

+0

私の友人の合計はinverse_friends + friendsですか? –

関連する問題