我想建立一本基本食谱。与食谱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
这感觉很难看。但我不知道任何其他解决方案。
答案 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:成分
端