2

RailsにRecipeというモデルがあります。レシピモデルには材料が含まれています。各材料ラインには、食品モデルまたは別のレシピとの関連があります。したがって、基本的には、食品モデルとレシピモデルへのポリモーフィックな関連付けが必要です。ただし、変更を加えたとき、素材クラスのrecipe_idは常にnullです。協会に明らかな問題がありますか?

class Recipe < ActiveRecord::Base
  has_many :ingredients, :as => :element
end

class Food < ActiveRecord::Base
  has_many :ingredients, :as => :element
  has_many :recipes, :through => :ingredients
end

class Ingredient < ActiveRecord::Base
  belongs_to :element, :polymorphic => true
  belongs_to :recipe
end

したがって、基本的に、レシピの材料ラインには、別のレシピまたは食品テーブルの要素を含めることができます(各レシピには、任意の数の材料ラインを含めることができます)。

これが私が欲しいものを表す図面です:

テーブルの描画

そして、これが現在RubyMineでスキーマがどのように見えるかです:

Rubymine図

問題は、成分行(親テーブル)のrecipe_idがnullになっているため、ポリモーフィックアソシエーションの実装を開始したときにリレーションが機能しなくなったことです。

レシピを保存するときの挿入行は次のとおりです。

  SQL (3.4ms)  INSERT INTO "recipes" ("created_at", "description", "directions", "name", "owner", "recipe_source_type_id", "servings", "source", "time", "updated_at", "visibility") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING "id"  [["created_at", Sun, 10 Jun 2012 13:43:12 UTC +00:00], ["description", "Þetta er önnur prufuuppskrift"], ["directions", "Já, og leiðbeiningar"], ["name", "Prufuuppskrift II"], ["owner", 1], ["recipe_source_type_id", 1], ["servings", 3], ["source", "aaa"], ["time", 3], ["updated_at", Sun, 10 Jun 2012 13:43:12 UTC +00:00], ["visibility", 0]]
  SQL (0.9ms)  INSERT INTO "ingredients" ("created_at", "description", "element_id", "element_type", "order", "qty", "recipe_id", "unit_type_id", "updated_at", "user_entered_qty") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id"  [["created_at", Sun, 10 Jun 2012 13:43:13 UTC +00:00], ["description", "abc"], ["element_id", 9], ["element_type", "Recipe"], ["order", nil], ["qty", 2.0], ["recipe_id", nil], ["unit_type_id", 1], ["updated_at", Sun, 10 Jun 2012 13:43:13 UTC +00:00], ["user_entered_qty", "2 gramm"]]

後で取り組むもう1つの問題は、この場合、element_typeがレシピではなくFoodである必要があることです。どこに設定すればいいのかわかりません。

4

1 に答える 1

2

私が理解していることから、材料は食品とレシピの両方に属することができます。その場合は、ポリモーフィックアソシエーション要素がそれを処理します。

Ingredientsテーブルに2つのフィールドが作成されます。1つはとと呼ばelement_typeelement_id、ここelement_typeには関連するテーブルがelement_id含まれ、を参照するテーブルのレコードのIDが含まれますelement_type

これにより、belongs_to :recipe冗長になります。実際、Railsは、材料をレシピに割り当てるときに「ポリモーフィックフィールド」にデータを入力しますが、を設定してポリモーフィックフィールドにデータを入力するように指示しているため、recipe_idにはデータを入力しません:polymorphic => true

これがあなたのジレンマを説明することを願っています。私があなたに言ったことを念頭に置いて、このRailsCast on Polymorphic Associationsを見てください、そうすれば物事は解決するはずです。

私が助けてくれたことを願っています。

于 2012-06-14T23:18:43.880 に答える