4

以 Ryan Bates 的 asciicast 为例: http ://asciicasts.com/episodes/163-self-referential-association

他以用户的两个关联结束

  • :朋友们
  • :inverse_friends

鉴于用户不会关心谁挑起了友谊,你会想要一个简单的用户关联

  • :朋友们

由这两种关系组成。即用户发起的关系和用户的朋友发起的关系。

那么如何实现这种双向的自引用关联呢?

更新 - Josh Susser 在这里有一篇关于此的帖子:http: //blog.hasmanythrough.com/2006/4/21/self-referential-through

但是,它仍然会讨论 has_many :sources 和 has_many :sinks,而实际上应该有一个包含源和接收器的 has_many :nodes。

4

1 回答 1

8

看看这对你有用吗?

class User < ActiveRecord::Base
  has_many :friendships, :foreign_key => "person_id", :class_name => "Friendship"
  has_many :friends, :through => :friendships

  def befriend(user)
    # TODO: put in check that association does not exist
    self.friends << user
    user.friends << self
  end
end

class Friendship < ActiveRecord::Base
  belongs_to :person, :foreign_key => "person_id", :class_name => "User"
  belongs_to :friend, :foreign_key => "friend_id", :class_name => "User"  
end

# Usage
jack = User.find_by_first_name("Jack")
jill = User.find_by_first_name("Jill")

jack.befriend(jill)

jack.friends.each do |friend|
  puts friend.first_name
end
# => Jill

jill.friends.each do |friend|
  puts friend.first_name
end
# => Jack

这给出了一个数据库表模式

users
  - id
  - first_name
  - etc...

friendships
  - id
  - person_id
  - friend_id
于 2010-05-27T19:21:01.607 回答