2017-09-20 5 views
1

-ce que quelqu'un a un bon exemple de bout en bout de la façon de persister à la base de données un motif composite livre de texte de GoF tel que celui ci-dessous?persist une implémentation de motif composite - Ruby on Rails

classe de base des composants:

class Task 
    attr_reader :name 

    def initialize(name) 
    @name = name 
    end 

    def get_time_required 
    0.0 
    end 
end 

La classe composite:

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 

Répondre

0

Vous ne devez persister les attributs db, tels que name et time (vous voudrez probablement persister plutôt que l'assigner à l'exécution) et sub_tasks. Et vous ne faites cela que pour les tâches feuilles. En général, vous ne conservez pas toutes les tâches composites dans DB.

Vous pouvez utiliser ITS (héritage de table unique) pour réaliser ce modèle. Vous pouvez créer une classe de base Task < ActiveRecord::Base (en supposant que Rails4). Ensuite, vous sous-classez un LeafTask et un CompositTask à partir de cela. Ensuite, vous pouvez persister chaque tâche que vous avez comme une instance de l'un d'eux. Si vos tâches requièrent des interfaces très différentes, vous pouvez vouloir en sous-classer chacune. Si chacun d'eux exige même des attributs très différents, alors vous pouvez envisager l'héritage multitable (à savoir qu'ils sous-classe encore de Task, mais ils utilisent leurs propres tables).

+0

Merci. Comment persisteriez-vous les relations créées par CompositeTask? – rg1176

+0

a mis à jour mes réponses – EJ2015