Добавить количество в рецепт habtm Соотношение ингредиентов - PullRequest
0 голосов
/ 25 ноября 2010

Я хотел создать простую поваренную книгу. С рецептами 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 ]

3 голосов
/ 25 ноября 2010

выглядит нормально для меня, как схема / подход.Я думаю, это может показаться уродливым, потому что выбор имени класса приводит к тому, что вы часто набираете "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>
0 голосов
/ 25 ноября 2010

Я полагаю, вам не хватало has_many: сквозной в модели рецепта

класс Receipe

has_many: receipe_ingredients

has_many: ингридиенты,: through =>: receipe_ingredients

end

class Ingredient

has_many: receipe_ingredients

has_many: receipes,: through =>: receipe_ingredients

конец

класс ReceipeIngredient

принадлежат_ к: рецепту

принадлежат_ к: ингредиент

конец

...