Ruby on Rails:尽可能使用现有模型

时间:2015-10-14 08:48:12

标签: ruby-on-rails ruby model relational-database

我想创建从配方到配料的关系。基本上是:

recipe has_many ingredients
ingredients belongs_to recipe

但是,如果我在配方中添加一种成分,它应该看看是否存在具有相同名称的现有成分并且应该使用该成分。

是否有顺畅的解决方案?

2 个答案:

答案 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