2017-09-20 1 views
1

hat jemand eine gute Ende-zu-Ende-Beispiel, wie in der Datenbank ein Text-Buch-Composite-Muster von GoF wie die unten erhalten?Persistent eine Composite-Muster-Implementierung - Ruby on Rails

Component Basisklasse:

class Task 
    attr_reader :name 

    def initialize(name) 
    @name = name 
    end 

    def get_time_required 
    0.0 
    end 
end 

Verbund Klasse:

class CompositeTask < Task 
    def initialize(name) 
    super(name) 
    @sub_tasks = [] 
    end 

    def add_sub_task(task) 
    @sub_tasks << task 
    end 

    def remove_sub_task(task) 
    @sub_tasks.delete(task) 
    end 

    def get_time_required 
    time = 0.0 
    @sub_tasks.each { |task| time += task.get_time_required } 
    time 
    end 
end 

Antwort

0

Sie müssen nur die Attribute bestehen db, wie name und time (Sie wahrscheinlich anhalten wollen, anstatt während der Laufzeit zuweisen) und sub_tasks. Und Sie tun dies nur für die Blattaufgaben. In der Regel bleiben nicht alle einzelnen zusammengesetzten Aufgaben in der Datenbank bestehen.

Sie können STI (Single Table Vererbung) verwenden, um dieses Muster zu realisieren. Sie können eine Basisklasse Task < ActiveRecord::Base (unter der Annahme von Rails4) erstellen. Dann untergliedern Sie davon eine LeafTask und eine CompositTask. Dann können Sie jede Aufgabe, die Sie haben, als eine der beiden Instanzen beibehalten. Wenn für Ihre Aufgaben sehr unterschiedliche Schnittstellen erforderlich sind, sollten Sie die einzelnen Unterklassen jeweils untergliedern. Wenn jede von ihnen sogar sehr unterschiedliche Attribute erfordert, dann könnten Sie eine mehrteilige Vererbung in Betracht ziehen (d. H. Sie bilden immer noch eine Unterklasse von Task, aber sie verwenden ihre eigenen Tabellen).

+0

Danke. Wie würden Sie die von der CompositeTask erstellten Beziehungen beibehalten? – rg1176

+0

aktualisierte meine Antworten – EJ2015