2009-06-23 5 views
4

Ich versuche, ein Social-Networking-Stil-Freundschaftsmodell zu implementieren, und ich hatte nicht viel Glück beim Versuch, die verfügbaren Plugins herauszufinden. Ich denke, ich werde Rails besser lernen, wenn ich es selbst mache. Also hier ist, was ich habe:Wie mache ich reflexive Self-Join-Beziehungen in ActiveRecord?

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 wenn ich versuche, dies:

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

Ich erhalte eine Fehlermeldung:

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 Freundschaftssystem:

  • Ein Benutzer kann andere Benutzer einladen, Freunde zu werden.
  • Benutzer, die Sie eingeladen haben, Freunde zu werden, werden durch invited_friends dargestellt.
  • Benutzer, die Sie eingeladen haben, Freunde zu werden, werden durch inviter_friends dargestellt.
  • Ihre gesamte Freundesliste wird durch invited_friends + inviter_friends repräsentiert.

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 
+0

welche Fehler bekommen Sie? –

+0

hat gerade den Fehler hinzugefügt – udit

+0

Pls bieten das vollständige Schema. Die Plugin-Rake-Aufgabe Annotate Models - http://pragdave.pragprog.com/pragdave/2006/02/annotate_models.html und http://agilewebdevelopment.com/plugins/annotate_models - ist dafür sehr hilfreich. Es dokumentiert die Schemas der Modelle als Kommentare in den Modelldateien. –

Antwort

7

Ich bin überrascht, niemand hat screencast auf das Thema der letzten Ryan Bates zeigte :)

hoffe, das hilft !.

Auszug aus Ryan‘... eine selbstbezüglicher Verein auf dem User-Modell Freunde/Anhänger zu definieren erfordert

+0

Danke, dieses Video war genau das, was ich brauchte. – udit