Comment puis-je créer des relations auto-jointives réflexives dans ActiveRecord?
-
06-07-2019 - |
Question
J'essaie d'implémenter un modèle d'amitié de type réseautage social et je n'ai pas eu beaucoup de chance d'essayer de trouver les plugins disponibles. Je pense que je vais mieux apprendre Rails si je le fais moi-même. Alors voici ce que j'ai:
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
Dans irb
quand j'essaie ceci:
friend1 = Friend.create(:name => 'Jack')
friend2 = Friend.create(:name => 'John')
bff = Friendship.create(:user_id =>1, :friend_id => 2)
f1.invited_friends
Je reçois une erreur:
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 du système d'amitié:
- Un utilisateur peut inviter d'autres utilisateurs à devenir amis.
- Les utilisateurs que vous avez invités à devenir amis sont représentés par
guest_friends
. - Les utilisateurs qui vous ont invité à devenir amis sont représentés par
inviter_friends
. - Votre liste d'amis totale est représentée par
amis_invités
+amis_inviter
.
Schéma
table Friendship
t.integer :user_id
t.integer :friend_id
t.boolean :invite_accepted
t.timestamps
table User
t.string :name
t.string :description
La solution
Je suis surpris que personne n'ait signalé le récent screencast de Ryan Bates sur le sujet :)
J'espère que ça aide!
Extrait de Ryan '... nécessite une association auto-référentielle sur le modèle utilisateur pour définir les amis / suiveurs'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow