Rieles: has_many con los detalles adicionales?
-
21-09-2019 - |
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
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:
- clase Ingrediente (pertenece a la receta, tiene muchos ingredientrecipecounts)
- Receta clase (tiene muchos ingredientes, tiene muchos ingredientrecipecounts)
- 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.