Rails协会难题

时间:2013-02-27 02:46:00

标签: ruby-on-rails activerecord associations

我正在创建一个存储食谱的服务,我正在尝试为每种成分创建一个包含可选首选品牌的成分列表。因此,例如,我可能会说面食配方使用去皮西红柿,首选品牌是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和ingredient_id都指向同一模型,并且:preferred_ingredients实际上并不作为符号存在。我需要以不同的方式建立我的协会吗?

2 个答案:

答案 0 :(得分:1)

假设您将成分参考存储在RecipeIngredient中,

belongs_to :preferred_ingredient, class_name: 'Ingredient'

我也认为你引用了RecipeIngredient中的成分,所以你也希望将has_one更改为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

答案 1 :(得分:0)