2017-09-20 6 views
1

誰かが以下のようなGoFのテキストブックの合成パターンをデータベースに保持する方法のエンドツーエンドの良い例はありますか?複合パターンの実装を維持する - ruby​​ on ruby​​

コンポーネントの基本クラス:

class Task 
    attr_reader :name 

    def initialize(name) 
    @name = name 
    end 

    def get_time_required 
    0.0 
    end 
end 

複合クラス:

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 

答えて

0
あなただけな nametimeとして(あなたはおそらくそれを永続化ではなく、したい、属性はDBへの永続化する必要がある

実行時に割り当てます)とsub_tasksです。そして、あなたは葉の仕事のためにこれを行うだけです。通常は、すべての単一の複合タスクをDBに保持しません。

このパターンを実現するには、STI(単一テーブル継承)を使用できます。 1つの基底クラスTask < ActiveRecord::Base(Rails4を想定)を作成できます。次に、LeafTaskCompositTaskをサブクラス化します。そして、あなたが持っているすべてのタスクをいずれかのインスタンスとして保持することができます。あなたのタスクが非常に異なるインターフェースを必要とする場合は、それらのそれぞれをサブクラス化したいかもしれません。それぞれに非常に異なる属性が必要な場合でも、マルチテーブル継承を考慮する(つまり、サブクラスはTaskですが、独自のテーブルを使用します)。

+0

ありがとうございました。あなたはCompositeTaskによって作成された関係をどのように維持しますか? – rg1176

+0

更新しました – EJ2015

関連する問題