2012-08-26 5 views
0

J'ai une table appelée recettes et une autre appelée ingrédients. Les ingrédients peuvent se connecter aux aliments ou aux recettes (une recette peut contenir d'autres recettes). Je l'ai implémenté avec la partie nourriture mais je ne sais pas comment implémenter la partie recette. J'ai créé une autre table appelée la partie de nourriture appelée recipe_as_ingredients que je ne remplirai pas quand une recette est enregistrée avec les recettes sélectionnées comme ingrédients dans la recette actuelle. Je devrais probablement mettre à jour la table avant chaque sauvegarde et supprimer manuellement les lignes si elles sont supprimées pour les recettes. Y a-t-il une meilleure façon de l'implanter?Rails association polymorphe avec table de connexion

Voici les modèles:

class Recipe < ActiveRecord::Base 
    has_many :ingredients 
end 

class Ingredient < ActiveRecord::Base 
    belongs_to :element, :polymorphic => true 
    belongs_to :recipe 
end 

class Food < ActiveRecord::Base 
    has_many :ingredients, :as => :element 
end 

class RecipeAsIngredient < ActiveRecord::Base 
    has_many :ingredients, :as => :element 
end 

régler manuellement le type d'élément dans une fonction avant d'enregistrer, donc je devrais à même une recette comme ingrédient mais assurez-vous que recipe_as_ingredient contient un enregistrement pour se connecter l'ingrédient:

self.element_id = numid.id 
self.element_type = 'Food' 

ps Je ne pouvais pas connecter la recette sans les tables de connexion recipe_as_ingredients, car cela rendait l'enregistrement impossible car la recette était à la fois un enregistrement de fiche et de détail et le champ id était toujours nul.

Répondre

0

Vous êtes si proche.

Move: has_many: ingrédients,: comme =>: élément

sur le modèle de recettes.

RecipeAsIngrident doit exister. Si vous voulez obtenir tous les aliments utilisés dans la recette, vous voulez une fonction sur la recette pour résumer les descendants. Ce serait un total calculé, donc vous n'auriez pas besoin de rappels pour la mise à jour des totaux etc., mais j'ajouterais de la logique pour empêcher la suppression d'une recette qui est utilisée pour autre chose.

Demandez si vous avez besoin plus de précisions.

+0

Bonjour. Lorsque je déplace cette ligne vers le modèle de recette, toutes les lignes d'ingrédients sont corrompues lorsque j'enregistre une recette, cela ne fonctionne donc pas. – gugguson

+0

Si vous avez des données existantes, vous devrez peut-être les modifier pour se conformer à la nouvelle spécification. à condition que vous ayez déjà 'recette a' et 'aliment' dans la base de données, essayez ceci dans la console: 'r = Recipe.new';' r.ingredients.build ([{element: Recipe.first, quantité: 1} , {element: Food.first, quantité: 1}]) '; 'r.save!' – TomDunning

Questions connexes