2010-05-11 11 views
2

Veuillez patienter un instant car j'essaie d'expliquer exactement ce que je souhaite réaliser.To Interface or Not ?: Création dynamique d'une relation de modèle polymorphe dans Ruby on Rails

Dans mon application Ruby on Rails, j'ai un modèle appelé Page.

Il représente une page Web.

Je voudrais permettre à l'utilisateur d'attacher arbitrairement des composants à la page. Quelques exemples de "composants" seraient Picture, PictureCollection, Vidéo, VideoCollection, Arrière-plan, Audio, Formulaire, Commentaires. Actuellement, j'ai

une relation directe entre la page et l'image comme ceci:

class Page < ActiveRecord::Base 
    has_many :pictures, :as => :imageable, :dependent => :destroy 
end 

class Picture < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
end 

Cette relation permet à l'utilisateur d'associer un nombre arbitraire d'images à la page. Maintenant, si je veux fournir plusieurs collections je aurais besoin d'un modèle supplémentaire:

class PictureCollection < ActiveRecord::Base 
    belongs_to :collectionable, :polymorphic => true 
    has_many :pictures, :as => :imageable, :dependent => :destroy 
end 

et de modifier la page pour référencer le nouveau modèle:

class Page < ActiveRecord::Base 
    has_many :picture_collections, :as => :collectionable, :dependent => :destroy 
end 

Maintenant, il serait possible pour l'utilisateur d'ajouter un nombre des collections d'images à la page.

Cependant, cela reste très statique en raison de la référence: picture_collections dans le modèle Page. Si j'ajoute un autre "composant", par exemple: video_collections, je devrais déclarer une autre référence dans la page pour ce type de composant.

Alors ma question est la suivante:

Ai-je besoin d'ajouter une nouvelle référence pour chaque type de composant, ou est-il une autre façon? Dans Actionscript/Java je voudrais déclarer une interface Component et faire en sorte que tous les composants implémente cette interface, alors je pourrais juste avoir un seul attribut: components qui contient tous les objets du modèle associés dynamiquement.

Voici Rails, et je suis sûr qu'il existe un excellent moyen d'y parvenir, mais c'est une question délicate pour Google. Peut-être que vous, les bonnes personnes, avez des suggestions judicieuses. Merci d'avance de prendre le temps de lire et de répondre à cette question.

Répondre

0

Je crois que vous pouvez utiliser juste

class Page < ActiveRecord::Base 
    has_many :components, :as => :attachable, :dependent => :destroy 
end 

class Picture < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 
end 

class PictureCollection < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 
    has_many :pictures, :as => :imageable, :dependent => :destroy 
end 

et ainsi de suite ...

+0

Salut J, j'ai essayé, mais je continue à avoir une page constante ':: uninitialized Component' erreur lorsque j'accède à Page.components Avez-vous des suggestions pour résoudre ce problème? merci – ktec

+0

Je pensais ... peut-être que vous devez définir chaque relation ... ou définir une classe 'Component' et faire' Picture' et 'PictureCollection' dériver de cette classe. –