私はRecipe
モデルとモデルを持っていIngredient
ます。今はレシピ
has_and_belongs_to_many :ingredients
と材料has_and_belongs_to_many
:recipes
です。
Ingredient はおそらく他の Ingredients で構成されている可能性があるため、次のように、そのモデルで自己結合を実行しようとしています。
has_many :components, class_name: 'Ingredient', foreign_key: 'parent_id'
belongs_to :parent, class_name: 'Ingredient'
さて、これは機能しますが、各成分は 1 つの親しか持つことができません。たとえば、マヨネーズはレシピの一部である「クラブ ケーキ」成分に含まれていますが、一部の「スパイシー マヨ」成分の成分にはなりません。他のレシピを同時に。
私が取得しようとしているのは、次のようなインターフェイスです。
r = Recipe.create(name: "Jumbo Lump Crab Cakes")
r.ingredients << Ingredient.create(name: "Crab Cakes")
r.ingredients[0].ingredients # => []
r.ingredients[0].ingredients.create(name: "Mayonnaise")
r.ingredients[0].ingredients # => [#<Ingredient id: 2, name: "Mayonnaise">]
r.ingredients[0].ingredients[0].ingredients.create(name: "Eggs")
r.ingredients[0].ingredients[0].ingredients # => [#<Ingredient id: 3, name: "Eggs">]
Ingredient.last # => #<Ingredient id: 3, name: "Eggs">
Ingredient.last.parent # => #<Ingredient id: 2, name: "Mayonnaise">
Ingredient.last.parent.parent # => #<Ingredient id: 1, name: "Crab Cakes">
# Bonus points if a child ingredient can "walk up" its heritage tree to the recipe:
Ingredient.last.recipe # => #<Recipe id: 1>
明らかに、成分/副成分の関係を格納するための関連付けテーブルが必要ですが、それは私が理解している限りです。私はさまざまな偉業source
とthrough
魔法を試しましたが、うまくいきませんでした。
また、すべてに親があり、Ingredient タイプまたは Recipe タイプのいずれかであるポリモーフィックな関連付けをいじりましたが、必要なインターフェイスでそれをうまく機能させることができませんでした。