我想创建从配方到配料的关系。基本上是:
recipe has_many ingredients
ingredients belongs_to recipe
但是,如果我在配方中添加一种成分,它应该看看是否存在具有相同名称的现有成分并且应该使用该成分。
是否有顺畅的解决方案?
答案 0 :(得分:1)
你需要扩展你的模式:你需要区分一个成分,如#34;所有目的面粉",你想要在你的数据库中,然后" 100克的所有目的面粉"可能会在特定食谱中使用。
我会做这样的事情:
Recipe
has_many :recipe_ingredients
#fields - name
RecipeIngredient
belongs_to :ingredient
belongs_to :recipe
#fields - quantity
Ingredient
has_many :recipe_ingredients
#fields - name
现在,当您构建食谱时,您需要构建一个关联的recipe_ingredients
列表,每个列表都指向一种成分(例如"通用面粉"成分)并且有一定数量,例如" 100克"。
注意 - 我可以添加" has_many:成分,:through => :recipe_ingredients"食谱,但我实际上并不认为这是一个有用的关联:当食谱有量时,食谱只对食谱有意义 - 我不认为你会想说"食谱。成分"因为这并没有给你数量信息。
答案 1 :(得分:0)
以标准方式设置所有重新设置(HABTM),您可以按名称添加成分:
# reciept.rb
def add_ingredient_by_name(ingredient_name)
self.ingredients << Ingredient.find_or_create_by(name: ingredient_name)
end
<强>更新强> 另外,我会为成分名称添加唯一性约束以确保安全性:
# ingredient.rb
validates_uniqueness_of :name