双向自引用关联

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

他以两个User用户结束

  • :朋友
  • :inverse_friends

鉴于用户不关心是谁煽动友谊,你会想要一个简单的用户关联

  • :朋友

这包括两种关系。 即,由用户发起的关系以及由用户的朋友发起的关系。

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

更新 – Josh Susser在此发表了一篇文章: http : //blog.hasmanythrough.com/2006/4/21/self-referential-through

然而,它仍然讨论has_many:sources和has_many:sink真的应该有一个has_many:包含源和接收器的节点。

看看这对你有用吗?

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