1

以下を最も簡単な方法でモデル化したいと思います。

スキルには多くの依存スキルがあります。

各スキルは単独で存在する必要があり、スキルには前提スキルである他のスキルが含まれる場合があります。

例えば:

Skill: Front-End Development Has Dependent Skills -> [HTML, CSS, SCSS]
Skill: Web-Design Has Dependent Skills -> [HTML, CSS]
Skill: HTML

私はできるようにしたい:

@front_end_development.dependent_skills ##or a more semantic mapping

木の上を歩きたいのですが、そうするのに最適な名前が思いつきません。おそらく、Web-Design が依存する HTML を介して参照したいと思います。


これを自己参照にすることは理にかなっていますか?それとも、これが私の脳を傷つけているという事実は、コードの匂いであり、何か他のものが理想的であると懇願していますか? それはすべて、他のスキルに依存するスキルに帰着します。

mongo を使用してこれをモデル化する方がよいでしょうか?

4

1 に答える 1

1

スキルのすべての依存関係を取得する必要があるたびにツリー (実際には有向グラフに似ています) を反復処理する代わりに、特定のスキルに新しい依存関係を追加するときに、暗黙の依存関係を反復処理し、これらを というテーブルに保存することができます。スキルを依存関係に、またはその逆にマッピングする「依存関係」。例(関係はより適切に表現できます):

class Skill
    has_many :dependers, class_name: 'Dependency', foreign_key: :dependee_id
    has_many :dependees, class_name: 'Dependency', foreign_key: :depender_id

    has_many :dependencies, through: :dependees
    has_many :depending, through: :dependers

    def add_dependency(skill)
        recurse_dependencies(skill)
    end

    def recurse_dependencies(skill)
        # perform this check to avoid circular and duplicate dependencies
        if !depender_ids.include?(skill.id) && !dependee_ids.include?(skill.id)
            dependee_ids << skill.id
        end

        skill.dependencies.each do |dependency|
            recurse_dependencies(dependency)
        end
    end
end

class Dependency
    belongs_to :dependee
    belongs_to :depender
end

その後、次のようなことができるはずです。

@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)
于 2012-07-18T00:03:45.033 に答える