(Many-to-many)-to many

I’m very new at rails and wondering if ActiveRecord supports (many-to-
many)-to many relationships.

For example: I have recipes, ingredients, and cookingmethods. Recipes
have many ingredients, and ingredients are in many recipes. For each
ingredient in a recipe, there is a different cooking method. For
example, potatoes in a salad are diced, but potatoes in potato chips
are sliced. Example database tables:

recipes: id, name
recipes_ingredients: id, recipe_id, ingredient_id
ingredients: ingredient_id, name
cookingmethods: id, name
recipes_ingredients_cookingmethods: recipe_ingredient_id,
cookingmethod_id

I looked at through associations, but those seemed to deal only with
many-to-many relationships.

Thanks,

Gerry

I’m, looking at something similar, try this
(http://groups.google.com/group/rubyonrails-talk/browse_frm/thread/
b4e27651fb149e48?lnk=igtc)
and let me know how you get on? I’d be interested in seeing your
model and any extra finder methods you add…

Feel free to gTalk me

J

To do this, you have your ingredients, recipes and cooking_methods
tables,
as well as a join table… let’s call this recipe_ingredients. This
would
have foreign key columns, one for each of the other tables.

Recipe
has_many :recipe_ingredients
has_many :ingredients, :through => :recipe_ingredients
has_many :cooking_methods, :through => :recipe_ingredients

Ingredient
has_many :recipe_ingredients
has_many :recipes, :through => :recipe_ingredients
has_many :cooking_methods, :through => :recipe_ingredients

CookingMethod
has_many :recipe_ingredients
has_many :ingredients, :through => :recipe_ingredients
has_many :recipes, :through => :recipe_ingredients

RecipeIngredient
belongs_to :recipe
belongs_to :ingredient
belongs_to :cooking_method

There. It’s quite easy really. You just have to break down three-way
relationships into two way ones, and that’ll solve any (database)
relationship problems.

Hope this helps,
-Nathan

*this would have three foreign key columns, one for each of the other
tables.

Thanks. I’ll try that out. I’ve never gotten such a quick answer from
posting a programming question on any forum before.

Gerry

I’d be interested to see how the and controllers and views should be
constructed for this model

J

My inner database normalization conscience has some misgivings about
this schema. Suppose the number of cooking methods is large compared
to the number of recipe/ingredients. So potatoes in potato chips can
be sliced, diced, grated… Then I’ll end up duplicating the recipe/
ingredients foreign keys a lot in the join table.

Suppose further that people can comment on each recipe/ingredient/
cooking method combination. I would have to add a “comments” column to
recipes_ingredients. Then for each comment, I’ll have to duplicate the
keys for recipes/ingredients/cookingmethod…this is clearly
unnormalized.

So I think my original schema gives me more flexibility in the long
run. Any way I can get rails to work with the original schema (see
first post in thread)?

Thanks for your help.

Gerry

On 2/24/07, mastica [email protected] wrote:

keys for recipes/ingredients/cookingmethod…this is clearly
unnormalized.

normalisation is not necessarily the best design in all cases… but I
digress…

So I think my original schema gives me more flexibility in the long
run. Any way I can get rails to work with the original schema (see
first post in thread)?

Of course. You need to promote your ingredient/cookingmethod table to
a proper first-class model. If you find yourself talking (or thinking)
about a join table a lot, it’s usually a sign that it wants to be a
model.

You’ll also want to read up on has_many :through.

Let’s call that model Preparation. You then have:

class Ingredient
has_many :preparations
has_many :cooking_methods, :through=>:preparations
has_many :recipes, :through=>:preparations
end

class Recipe
has_and_belongs_to_many :preparations
has_many :ingredients, :through=>:preparations
end

class CookingMethod
has_many :preparations
has_many :ingredients, :through=>:preparations
end

class Preparation
has_and_belongs_to_many :recipes
belongs_to :ingredient
belongs_to :cooking_method
end

5 tables total, one for each of the models, plus a preparations_recipes
table.

–max

Im getting an error when running an app under fastCGI

file …/public_html/…/config/…/tmp/sessions//ruby_sess.(whatver) not
readable

app works fine under regular cgi.

What would cause this?

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs