2009-09-12 7 views
0

Je n'arrive pas à comprendre les associations Rails. Disons que j'ai 3 tables. Un pour les utilisateurs, un pour les recettes et un pour les ingrédients. Voici un exemple de la base de données (en YAML):Rails Associations

Users: 
    id: 1 
    email: funnyusername 
    password: pass1234 

Recipes: 
    id: 1591 
    user_id: 1 
    name: Pizza Dough 

Ingredients: 
    id: 1 
    name: Flour 

    id: 2 
    name: Water 

    id: 3 
    name: Yeast 

Maintenant, comment pourrais-je faire en sorte qu'un utilisateur peut avoir de nombreuses recettes, et une recette peut avoir beaucoup d'ingrédients. Et aussi être capable de trouver toutes les recettes auxquelles chaque ingrédient est attaché? Par exemple, funnyusername a créé la recette "Pizza Dough" qui contient les ingrédients Flour, Water et Yeast. Maintenant, quand je cherche de la levure, je voudrais qu'il propose une liste de recettes contenant de la levure.

Répondre

2

Voici les associations:

# In User.rb 
has_many :recipes 

# In Recipe.rb 
belongs_to :user 
has_and_belongs_to_many :ingredients 

# In Ingredient.rb 
has_and_belongs_to_many :recipes 

Maintenant, cela suppose qu'il ya une table ingredients_recipes avec deux colonnes, recipe_id & ingredient_id. Donc, avec votre exemple, vous pouvez trouver toutes les recettes avec de la levure ainsi:

@recipes = Ingredient.find(:all, :conditions => {:name=> 'Yeast'}).recipes; 

Dans votre situation, vous avez des ingrédients qui apparaissent dans de nombreuses recettes et les recettes qui ont beaucoup d'ingrédients. Avec Rails (en fait ActiveRecord) Les associations, c'est a et appartient à plusieurs (HABTM) est expliqué here

La convention est que lorsque vous associez deux tables avec HABTM, vous aurez une table se joindre à deux colonnes , chacun pointant vers la clé primaire d'une table. Cette table de jointure a pas lui-même ont un modèle correspondant. Enfin, la convention de dénomination de la table est que vous joignez les deux noms des tables que la table de jointure joint (ingrédients et recettes) dans l'ordre alphabétique. Dans votre exemple: ingredients_recipes. Cela peut bien sûr être annulé.

+0

Ahh, merci! Maintenant, je vais le tester et regarder la base de données pour réellement * comprendre * it = p – RyanScottLewis

Questions connexes