0

私は料理のレシピを保存するサービスを作成しており、各材料のオプションの優先ブランドを使用して材料のリストを作成しようとしています。たとえば、パスタのレシピは皮をむいたトマトを使用しており、好ましいブランドはCentoです。私の材料は階層カテゴリツリーに保存されているため、優先される材料はそのツリーの材料の子です。

これが私の単純化されたデータベース設定です:

recipes
- name
- instructions

ingredients
- name

recipe_ingredients
- recipe_id
- ingredient_id
- preferred_ingredient_id
- amount

そして協会:

class Recipe < ActiveRecord::Base
  has_many :recipe_ingredients
  has_many :ingredients, :through => :recipe_ingredients
  has_many :preferred_ingredients, :through => :recipe_ingredients
end

class Ingredient < ActiveRecord::Base
end

class RecipeIngredient < ActiveRecord::Base
  belongs_to :recipe
  has_one :ingredient
  has_one :preferred_ingredient
end

Preferred_ingredient_idとcomponent_idの両方が同じモデルを指していること、および:preferred_ingredientsが実際にはシンボルとして存在しないことを処理する方法がわかりません。アソシエーションを別の方法で設定する必要がありますか?

4

2 に答える 2

1

成分参照をRecipeIngredientに保存していると仮定すると、

belongs_to :preferred_ingredient, class_name: 'Ingredient'

has_oneまた、RecipeIngredientの材料を参照していると思うので、そこにも変更したいと思いbelongs_toます。(レシピが削除された場合、材料が破壊されることは理にかなっていますか?)

しかし、実際には特定の成分について多くの選択肢があることを考えると、次のようなものを探している可能性があります。

RecipeIngredient:

belongs_to :recipe
belongs_to :preferred_ingredient, class_name: 'Ingredient'
has_many :ingredient_options
has_many :ingredients, through: :ingredient_options

IngredientOption

belongs_to :recipe_ingredient
belongs_to :ingredient
于 2013-02-27T02:51:11.837 に答える
0

@ self-referential-associationもご覧ください。

また、これはRailsアソシエーションに役立つ可能性があります --has_many =>:through-しかし同じモデル

于 2013-02-27T16:08:01.277 に答える