Bitte haben Sie einen Moment Geduld mit mir, wenn ich versuche zu erklären, was genau ich erreichen möchte.
In meiner Ruby on Rails-Anwendung habe ich ein Modell namens Page.
Sie stellt eine Webseite dar.
Ich möchte dem Benutzer die Möglichkeit geben, beliebige Komponenten an die Seite anzuhängen. Einige Beispiele für "Komponenten" wären Picture, PictureCollection, Video, VideoCollection, Background, Audio, Form, Comments.
Derzeit habe ich eine direkte Beziehung zwischen Seite und Bild wie folgt:
class Page < ActiveRecord::Base
has_many :pictures, :as => :imageable, :dependent => :destroy
end
class Picture < ActiveRecord::Base
belongs_to :imageable, :polymorphic => true
end
Diese Beziehung ermöglicht es dem Benutzer, der Seite eine beliebige Anzahl von Bildern zuzuordnen. Wenn ich nun mehrere Sammlungen anbieten möchte, benötige ich ein zusätzliches Modell:
class PictureCollection < ActiveRecord::Base
belongs_to :collectionable, :polymorphic => true
has_many :pictures, :as => :imageable, :dependent => :destroy
end
Und ändern Sie Page, um auf das neue Modell zu verweisen:
class Page < ActiveRecord::Base
has_many :picture_collections, :as => :collectionable, :dependent => :destroy
end
Nun kann der Benutzer eine beliebige Anzahl von Bildsammlungen auf der Seite hinzufügen.
Allerdings ist dies immer noch sehr statisch in Bezug auf die :picture_collections-Referenz im Seitenmodell. Wenn ich eine weitere "Komponente" hinzufüge, z. B. :video_collections, müsste ich für diesen Komponententyp eine weitere Referenz in der Seite deklarieren.
Meine Frage ist also folgende:
Muss ich für jeden Komponententyp eine neue Referenz hinzufügen, oder gibt es eine andere Möglichkeit? In Actionscript/Java würde ich eine Schnittstelle Component deklarieren und alle Komponenten dazu bringen, diese Schnittstelle zu implementieren. Dann könnte ich nur ein einziges Attribut :components haben, das alle dynamisch verbundenen Modellobjekte enthält.
Dies ist Rails, und ich bin sicher, es ist ein guter Weg, dies zu erreichen, aber seine eine schwierige zu Google. Vielleicht haben Sie gute Leute einige kluge Vorschläge. Vielen Dank im Voraus für die Zeit nehmen, zu lesen und zu beantworten dies.