see if this works for you?
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
this sets the database table schema
users - id - first_name - etc... friendships - id - person_id - friend_id
source share