2010-10-02 7 views
1

Donc, si j'ai une association polymorphe dans mon application, y a-t-il un moyen d'y ajouter des méthodes? Par exemple, si: post,: photo et: utilisateur sont tous associés à: classements avec une association polymorphe nommée: classable, puis-je créer des méthodes sur: classable qui serait alors hérité par: post,: photo ou: user? Je suppose que, si cela est possible, il faudrait que j'ajoute un modèle Rankable à l'application et que je définisse des méthodes à l'intérieur. Est-ce possible? Si oui, et j'ai raison de devoir créer un modèle, de quelle classe hériterait ce modèle ou comment le définirais-je comme étant cette relation polymorphe?Comment ajouter des méthodes à une association polymorphe de rails?

Répondre

3

Je ne sais pas comment vous faites cela avec un modèle, mais vous pouvez facilement ajouter des méthodes avec mixins:

module RankableMethods 
    def do_something_useful 
    ... 
    end 
end 

class Post < ActiveRecord::Base 
    include RankableMethods 
    belongs_to :rankable, :polymorphic = true 
end 

p = Post.new 
p.respond_to?(:do_something_useful) # true 
1

Vous devez séparer les concepts de « polymorphes » comme elle s'applique à un Association polymorphique ActiveRecord, et «polymorphique» dans le sens classique de l'héritage de la POO. Un type polymorphe 'classable' dans le premier sens n'existe pas à l'exception d'une convention de base de données dans ActiveRecord qui permet à un enregistrement dans une table de se référer à des enregistrements dans plusieurs autres tables possibles. Si vous voulez exprimer cette abstraction plus spécifiquement dans votre modèle d'objet - le polymorphisme dans le second sens - vous devrez déclarer une classe ou un module distinct dans lequel votre ActiveRecords «classable» peut se mélanger ou hériter.

Questions connexes