2011-10-06 5 views
2

J'ai une table de jointure et j'aimerais que les deux associations belongs_to soient polymorphes. La relation regarderait comme suit:Double association polymorphique dans les rails

Double Polymorhpic

La structure de classe ressemblerait comme suit:

Class Tagable1 < ActiveRecord::Base 
    has_many :taggings 
    has_many :tag_group_1s, :through => :taggings 
    has_many :tag_group_2s, :through => :taggings 
    ... 
end 

Class TagGroup1 < ActiveRecord::Base 
    has_many :taggings 
    has_many :taggable_1s, :through => :taggings 
    has_many :taggable_2s, :through => :taggings 
    ... 
end 

Class Tagging < ActiveRecord::Base 
    belongs_to :taggable, :polymorphic => true 
    belongs_to :tag, :polymorphic => true 
end 

Il y a des inconvénients évidents à cette approche, en particulier la lourde charge sur la table des marquages. Ce que j'essaye de réaliser est une conception flexible qui me permet de créer de nouveaux Taggables ou TagGroups sans créer de nouvelles tables de jointure. Par exemple, sans le double polymorphe, Taggable1 aurait besoin d'une table Taggable1Taggings pour rejoindre Taggable1 avec les TagGroups polymorphes. De même, j'aurais besoin Taggable2Taggings, Taggable3Taggings, Taggable4Taggings, etc etc

J'aimerais être éclairé s'il y a des inconvénients que je ne pense pas.

+0

Qu'est-ce que vous étiquetez et qu'est-ce qu'un groupe de marques? Difficile d'offrir des conseils si vous ne partagez pas votre design actuel. – molf

+0

Taggables pourrait être un billet de blog, vidéo, nourriture ou une recette. Un TagGroup pourrait être un Food Groups pour lequel les éléments (auto-référentiels) seraient "Meats", un autre "Dairy", etc. Un autre TagGroup pourrait être des Restrictions Diététiques pour lesquelles les éléments (auto-référentiels) seraient "Gluten Free", un autre "Peanut Free", etc. – Mike

+0

Et quelle est exactement votre question? Vous voulez savoir si votre solution est un bon choix? –

Répondre

0

semble le acts-as-taggable-on gem pourrait vous simplifier la vie.

+0

agit-comme-taggable-on semble très bien, mais il ne semble pas être en mesure de vous dire la relation d'étiquette inverse. Par exemple, si j'ai le tag 'blue', je peux faire User.tagged_with ('blue') et Admin.tagged_with ('blue') mais je ne peux pas faire Tag.find ('blue'). Tagged_items pour lequel il me donnerait tous les utilisateurs et tous les administrateurs. – Mike

Questions connexes