Pregunta

Si bien no soy un newb completa de Ruby / Rails, todavía estoy bastante verde y estoy tratando de encontrar la manera de estructurar algunas relaciones de modelos. El ejemplo más simple que puedo pensar es la idea de "recetas" para cocinar.

Una receta se compone de uno o más ingredientes y la cantidad asociada de cada ingrediente. Supongamos que tenemos una lista maestra en la base de datos de todos los ingredientes. Esto sugiere dos modelos simples:

class Ingredient < ActiveRecord::Base
  # ingredient name, 
end

class Recipe < ActiveRecord::Base
  # recipe name, etc.
end

Si lo único que queríamos Recetas asociados con ingredientes, que es tan simpling como la adición de la belongs_to y has_many apropiado.

Pero lo que si queremos asociar información adicional con esa relación? Cada Recipe tiene uno o más Ingredients, pero queremos indicar la cantidad de la Ingredient.

¿Cuál es la forma rieles para modelar eso? ¿Es algo a lo largo de las líneas de un has_many through?

class Ingredient < ActiveRecord::Base
  # ingredient name
  belongs_to :recipe_ingredient
end

class RecipeIngredient < ActiveRecord::Base
  has_one :ingredient
  has_one :recipe
  # quantity
end

class Recipe < ActiveRecord::Base
  has_many :recipe_ingredients
  has_many :ingredients, :through => :recipe_ingredients
end
¿Fue útil?

Solución

recetas e ingredientes tener una cuenta y pertenece a muchos relación, pero que desea almacenar información adicional para el enlace.

En esencia lo que busca es una rica unen modelo. Sin embargo, una relación has_and_belongs_to_many no es lo suficientemente flexible como para almacenar la información adicional que requiera. En su lugar, tendrá que utilizar un has_many:. Través relatinship

Así es como me gustaría configurarlo.

Recetas columnas: instrucciones

class Recipe < ActiveRecord::Base
  has_many :recipe_ingredients
  has_many :ingredients, :through => :recipe_ingredients
end

recipe_ingredients columnas: receta_id, ingredient_id, cantidad

class RecipeIngredients < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :ingredient
end

columnas de ingredientes: Nombre

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

Esto proporcionará una representación básica de lo que está buscando hacer. Es posible que desee agregar una validación para RecipeIngredients para asegurar que cada producto está catalogado y una vez por receta, y una devolución de llamada a veces duplicados en una sola entrada.

Otros consejos

http://railsbrain.com /api/rails-2.3.2/doc/index.html?a=M001888&name=has_and_belongs_to_many

http://railsbrain.com /api/rails-2.3.2/doc/index.html?a=M001885&name=has_many

¿Qué hay de:

  1. clase Ingrediente (pertenece a la receta, tiene muchos ingredientrecipecounts)
  2. Receta clase (tiene muchos ingredientes, tiene muchos ingredientrecipecounts)
  3. clase IngredientRecipeCount (pertenece al ingrediente, pertenece a la receta)

Esto no es tanto la forma como se acaba de rieles establecer una relación más entre los datos en la base de datos. No es realmente un "tiene y pertenece a muchos", ya que cada ingrediente sólo tiene un recuento por receta, y cada receta de un cargo por cada ingrediente .. ¿Qué es la misma cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top