1

私は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>

明らかに、成分/副成分の関係を格納するための関連付けテーブルが必要ですが、それは私が理解している限りです。私はさまざまな偉業sourcethrough魔法を試しましたが、うまくいきませんでした。

また、すべてに親があり、Ingredient タイプまたは Recipe タイプのいずれかであるポリモーフィックな関連付けをいじりましたが、必要なインターフェイスでそれをうまく機能させることができませんでした。

4

1 に答える 1

0

私はそれを理解したと思います。この投稿の修正版を使用して終了しました。

create_table :ingredients do |t| # :hunts
  t.references :parent # :predator
  t.references :child  # :prey
end

add_index :ingredients, :parent_id # :hunts, :predator_id
add_index :ingredients, :child_id  # :hunts, :prey_id

create_table :components do |t| # :animals
  t.string :name
end

class Component < ActiveRecord::Base # Animal
  has_many :parentage, foreign_key: 'parent_id',
                       class_name: 'Ingredient',
                       dependent: :destroy

  has_many :children, through: :parentage

  has_many :progeny, foreign_key: 'child_id',
                     class_name: 'Ingredient',
                     dependent: :destroy

  has_many :parents, through: :progeny
end

class Ingredient < ActiveRecord::Base # Hunt
  belongs_to :parent, class_name: 'Component'
  belongs_to :child,  class_name: 'Component'
end

血統/子孫の命名にはかなり満足しています。

于 2013-04-09T04:06:01.917 に答える