Como eu faço reflexiva autojunção relacionamentos em ActiveRecord?
-
06-07-2019 - |
Pergunta
Eu estou tentando implementar um modelo de amizade estilo de rede social e eu não tenho muita muita sorte tentando descobrir os plugins disponíveis lá fora. Acho que vou aprender Rails melhor se eu fazer isso sozinho. Então aqui está o que eu tenho:
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
Em irb
quando eu tente o seguinte:
friend1 = Friend.create(:name => 'Jack')
friend2 = Friend.create(:name => 'John')
bff = Friendship.create(:user_id =>1, :friend_id => 2)
f1.invited_friends
Eu recebo um erro:
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 do sistema de amizade:
- O usuário pode convidar outros usuários para se tornar amigos.
- Os usuários que você convidou para se tornar amigos são representados por
invited_friends
. - Os usuários que você convidou para se tornar amigos são representados por
inviter_friends
. - A lista total de amigo é representado por
invited_friends
+inviter_friends
.
Esquema
table Friendship
t.integer :user_id
t.integer :friend_id
t.boolean :invite_accepted
t.timestamps
table User
t.string :name
t.string :description
Solução
Estou surpreso que ninguém tenha apontou para a recente Ryan Bates é screencast sobre o tema :)
Espero que isso ajude !.
Trecho de Ryan' ... requer uma associação de auto-referencial no modelo de usuário para definir amigos / seguidores
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow