添加数量到配方habtm成分关系

时间:2010-11-25 10:28:34

标签: ruby-on-rails design-patterns has-and-belongs-to-many recipe

我想建立一本基本食谱。与食谱habtm成分关系。

我的第一次尝试是这样的。

class Recipe < ActiveRecord::Base
  # title, description
  has_many :recipe_ingredients
end

class Ingredient < ActiveRecord::Base
  # name, unit
  has_many :recipe_ingredients
  has_many :recipes, :through => :recipe_ingredients
end

class RecipeIngredient < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :ingredient
  attr_accessible :amount
end

并创建了手工关系

RecipeIngredient.create(:recipe_id => 1, :ingredient_id => 2, :amount => 100)

recipe.recipe_ingredients.amout
recipe.recipe_ingredients.ingredient.unit
recipe.recipe_ingredients.ingredient.name

这感觉很难看。但我不知道任何其他解决方案。

2 个答案:

答案 0 :(得分:3)

对我而言,作为架构/方法看起来很好。我认为它可能只是觉得难看,因为你选择的类名会让你输入很多“recipe.recipe_ingredients.ingredient”。对我来说,一种“成分”是食物/液体/在食谱中使用的任何东西,因此联合表应该被称为“成分”。每种成分都有一个数量,并链接到“产品”或“项目”或类似的东西。

我会这样重命名:

Recipe
  has_many :ingredients
  has_many :items, :through => :ingredients

Ingredient
  #fields - recipe_id, item_id, quantity(string)
  belongs_to :recipe
  belongs_to :item

Item
  has_many :ingredients
  has_many :recipes, :through => :ingredients

现在在您的视图页面上,您可以说

<h2><%= recipe.name %></h2>
<dl>
  <% @recipe.ingredients.each do |ingredient| %>
    <dt><%= ingredient.item.name %></dt>
    <dd><%= ingredient.quantity %></dd>
  <% end %>
</dl>

答案 1 :(得分:0)

我猜你错过了has_many:通过recipe模型

类Receipe&lt;的ActiveRecord ::基

has_many:receipe_ingredients

has_many:成分,:通过=&gt; :receipe_ingredients

类成分&lt;的ActiveRecord ::基

has_many:receipe_ingredients

has_many:receipes,:through =&gt; :receipe_ingredients

类ReceipeIngredient&lt;的ActiveRecord ::基

belongs_to:receipe

belongs_to:成分