2008-10-29 4 views
3

J'ai deux modèles, Article et Post qui héritent tous les deux d'un modèle de base appelé ContentBase.Comment spécifier le champ "commentable_type" avec des associations polymorphes?

Vous pouvez laisser des commentaires à la fois sur les articles et sur les articles. J'utilise donc une association polymorphique entre les commentaires et l'article ou la publication.

Cependant, puisque Article et Post héritent de ContentBase, le champ commentable_type finit par être "ContentBase" pour les deux et tout vider.

Existe-t-il un moyen de spécifier le champ commentable_type dans la relation has_many dans Article et Post?

Edit:

Par "tout Fout" Je veux dire que s'il y a un article avec ID = 1 et Post avec ID = 1 et ajouter un commentaire avec commentable_id = 1, commentable_type = Contentbase, ce commentaire sera montrer à la fois pour l'article et la poste.

Voici le code:

class Article < BaseContent 
    has_many :comments, :as => :commentable 
end 

class Post < BaseContent 
    has_many :comments, :as => :commentable 
end 

et voici mon modèle Commentaire:

class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true 
end 

Répondre

2

Quelle est la classe Contentbase? Pouvez-vous déplacer ce code dans un module au lieu d'utiliser l'héritage?

Module BaseContent 
    def self.included(base) 
     base.class_eval do 
     validates_presence_of  :somefield 
     validates_length_of  :someotherfield 

     def my_method 
      "hello" 
     end 
     end 
    end 

end 
+0

Il y a un tas de fonctions partagées et validates_length_of pour quelques champs partagés. Est-il possible de le déplacer dans un module? –

1

Je ne pense pas que vous voulez faire. Pour les associations polymorphes, vous souhaitez que le champ XXX_type soit la classe de modèle de base et non la classe réelle. Je ne suis pas exactement sûr de la raison, mais je crois qu'il s'agit de déterminer le nom de la table à sélectionner pour obtenir les données polymorphes.

Je pense que vous devez examiner l'héritage de table unique, qui est ce qu'ActiveRecord utilise pour stocker des classes dérivées dans la base de données. Il suppose que puisque Article et Post sont des sous-classes de ContentBase, ils seront tous dans la même table ("content_bases" par défaut). Si c'est le cas, vous n'aurez jamais un article avec ID = 1 et un article avec ID = 1.

Quelques références:

Questions connexes