Some basic help on creating "friends" that are "users?"

New to RoR, trying to model this correctly (which should be super simple
I’d
think, but I’m stuck at the moment):

Any given “User” of the app can have a group of “friends” (where friends
are
also users.) (think typical facebook friends concept.)

I know I should have a ‘user_friends’ table that has two user_ids as fks
to
the User table one for the user and the other to hold multiple ‘friends’

My first shot is looking like this…

class User < ActiveRecord::Base
acts_as_authentic
has_many :user_friends, :dependent => :destroy
has_many :friends, :class_name => “User”, :foreign_key => “friend_id”,
:through => :user_friends, :dependent => :destroy
end

class UserFriend < ActiveRecord::Base
belongs_to :user
belongs_to :user, :class_name => “User”, :foreign_key => “friend_id”
end

#migration
class CreateUserFriends < ActiveRecord::Migration
def self.up
create_table :user_friends, :id => false do |t|
t.integer :user_id
t.integer :friend_id
t.timestamps
end
end

When I run my test, it barfs saying

Failures:

  1. User should create a user and some friends
    Failure/Error: user.friends << f1 << f2
    Could not find the source association(s) :user_friends in model
    UserFriend.
    Try 'has_many :friends, :through => :user_friends, :source => '.
    Is
    it one of :user?

Where my test looks like:

it “should create a user and some friends” do
user = Factory.create(:user_rick)
f1 = Factory.create(:user_rachel)
f2 = Factory.create(:user_fred)
user.friends << f1 << f2

On Mon, Aug 30, 2010 at 7:06 PM, Rick R [email protected] wrote:

has_many :user_friends, :dependent => :destroy
has_many :friends, :class_name => “User”, :foreign_key => “friend_id”,
:through => :user_friends, :dependent => :destroy
end

class UserFriend < ActiveRecord::Base
belongs_to :user
belongs_to :user, :class_name => “User”, :foreign_key => “friend_id”
end

Solved, I had to change UserFriend to:

class UserFriend < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => “User”, :foreign_key => “friend_id”
end

(Yes, I’ll remove the unnecessary foreign_key declarations as well.)