how to model relationship for a model to itself

I have a model named User, and the mysql table is users. Every user can have many friends. of course, every friend is a user. So, it's a relationship from user to user.

how to model this?

User has_and_belongs_to_may :users?

then how to define the table 'users_users' for this relationship.

it need 2 fields named user_id?

Thanks for your help.

Rockydd wrote:

I have a model named User, and the mysql table is users. Every user can have many friends. of course, every friend is a user. So, it's a relationship from user to user.

how to model this?

User has_and_belongs_to_may :users?

then how to define the table 'users_users' for this relationship.

Use the has_and_belongs_to_many :join_table option and name it something else.

Next, the Friendship concept in a social app might be too important to hide its join table. "Friends since 2008", "BFF", "sworn enemies", etc. Maybe the joining table should be a Model of its own. Then User gets...

  has_many :friends   has_many :users, :through => :friends

...roughly. Can anyone spot what my association is missing?

Hi --

Rockydd wrote:

I have a model named User, and the mysql table is users. Every user can have many friends. of course, every friend is a user. So, it's a relationship from user to user.

how to model this?

User has_and_belongs_to_may :users?

then how to define the table 'users_users' for this relationship.

Use the has_and_belongs_to_many :join_table option and name it something else.

Next, the Friendship concept in a social app might be too important to hide its join table. "Friends since 2008", "BFF", "sworn enemies", etc. Maybe the joining table should be a Model of its own. Then User gets...

has_many :friends has_many :users, :through => :friends

If you've got a Friendship model, though, you'd probably want something like:

   has_many :friendships

and then friends through friendships... except you'll run into the issue of the symmetry (or lack thereof) of the friendships table, which of course can't have two user_id fields. You can deal with this by having a "friend1_id" and "friend2_id" (or some such thing) field, and a concept of who has befriended whom. There's some examples of this in the comments at: http://blog.hasmanythrough.com/2006/4/21/self-referential-through

I imagine you could also do something with one friendship row and some finder SQL, but that will have to await the second cup of coffee :slight_smile:

David