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.
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
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