How do I do reflexive self-join relationships in ActiveRecord?

萝らか妹 提交于 2019-12-18 04:25:08

问题


I'm trying to implement a social networking style friendship model and I didnt have much much luck trying to figure out the plugins available out there. I think I'll learn Rails better if I do it myself. So here's what I have :

class User < ActiveRecord::Base
  has_many :invitee_friendships ,
           :foreign_key => :friend_id,
           :class_name => 'Friendship'

  has_many :inviter_friends,
            :through => :invitee_friendships

  has_many :inviter_friendships ,
           :foreign_key => :user_id,
           :class_name => 'Friendship'

  has_many :invited_friends,
            :through => :inviter_friendships

end

class Friendship < ActiveRecord::Base
  belongs_to :user
  //I think something needs to come here, i dont know what
end

In irb when I try this:

friend1  = Friend.create(:name => 'Jack')
friend2  = Friend.create(:name => 'John')
bff = Friendship.create(:user_id =>1, :friend_id => 2)
f1.invited_friends

I get an error:

ActiveRecord::HasManyThroughSourceAssociationNotFoundError:
Could not find the source
association(s) :invited_friend or
:invited_friends in model Friendship. 
Try 'has_many :invited_friends,
:through => :invited_friendships,
:source => <name>'.  Is it one of
:user?

Expanation of friendship system:

  • A user can invite other users to become friends.
  • Users who you invited to become friends are represented by invited_friends.
  • Users who invited you to become friends are represented by inviter_friends.
  • Your total friend list is represented by invited_friends + inviter_friends.

Schema

table Friendship
      t.integer :user_id
      t.integer :friend_id
      t.boolean :invite_accepted
      t.timestamps

table User
    t.string :name
    t.string :description

回答1:


I'm surprised no one has pointed to the recent Ryan Bates's screencast on the topic :)

Hope this helps!.

Excerpt from Ryan '... requires a self-referential association on the User model to define friends/followers'



来源:https://stackoverflow.com/questions/1034411/how-do-i-do-reflexive-self-join-relationships-in-activerecord

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!