2012-01-17 4 views
1

J'essaie d'ajouter une fonctionnalité similaire à mon site mais je n'arrive pas à trouver la bonne façon d'utiliser une association polymorphe. Un utilisateur doit pouvoir suivre 3 classes différentes, ces 3 classes ne suivent pas l'utilisateur. J'ai créé un utilisateur suivant utilisateur dans le passé, mais cela s'avère plus difficile.Mise en place d'une association polymorphe

Ma migration était

class CreateRelationships < ActiveRecord::Migration 
    def change 
    create_table :relationships do |t| 
     t.integer :follower_id 
     t.integer :relations_id 
     t.string :relations_type  
     t.timestamps 
    end 
    end 
end 

Mon modèle relationnel est

class Relationship < ActiveRecord::Base 
    attr_accessible :relations_id 
    belongs_to :relations, :polymorphic => true 
    has_many :followers, :class_name => "User" 
end 

Dans mon modèle d'utilisateur

has_many :relationships, :foreign_key => "supporter_id", :dependent => :destroy 

et dans les 3 autres modèles

has_many :relationships, :as => :relations 

Est-ce que je manque quelque chose avec la mise en place de cette association?

+0

Avez-vous essayé de tester ce via la console? Assurez-vous également d'exécuter vos migrations. Quels sont les 'autres 3 modèles'? –

+0

Pouvez-vous élaborer sur 'has_many: relations,: foreign_key =>" supporter_id "'? –

+0

désolé le "supporter_id" était une faute de frappe –

Répondre

5

Vous avez essentiellement ce droit, à l'exception de quelques erreurs mineures:

  • attr_accessible :relations_id est redondant. Retirez-le de votre modèle Relationship.

  • Les deux modèles et User appellent has_many pour s'associer l'un à l'autre. Relationship doit appeler belongs_to car il contient la clé étrangère. Dans votre modèle User, réglez :foreign_key => "follower_id".


Voici comment je le ferais.

Avoir une classe moyenne Follow avec l'association polymorphique sur le côté de contenu followable et has_many du côté de l'utilisateur follower (l'utilisateur a beaucoup de suit).

Tout d'abord, créer une table follows:

class CreateFollows < ActiveRecord::Migration 
    def change 
    create_table :follows do |t| 
     t.integer :follower_id 
     t.references :followable, :polymorphic => true 
     t.timestamps 
    end 
    end 
end 

Remplacer modèle Relationship avec un modèle Follow:

class Follow < ActiveRecord::Base 
    belongs_to :followable, :polymorphic => true 
    belongs_to :followers, :class_name => "User" 
end 

Inclure dans User modèle:

has_many :follows, :foreign_key => :follower_id 

Inclure dans vos trois followable classes:

has_many :follows, :as => :followable 

Vous pouvez maintenant faire:

TheContent.follows # => [Follow,...] # Useful for counting "N followers" 
User.follows   # => [Follow,...] 
Follow.follower  # => User 
Follow.followable # => TheContent 
+0

Merci beaucoup pour votre aide, je suis maintenant en train de rencontrer le problème de l'implémentation de la forme follow et unfollow tant que l'action create. Des conseils? –

Questions connexes