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.
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
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. –