Forum: Ruby on Rails (Many-to-many)-to many

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
mastica (Guest)
on 2007-02-23 12:50
(Received via mailing list)
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,

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


macarthy (Guest)
on 2007-02-23 13:13
(Received via mailing list)
I'm, looking at something similar, try this
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

unknown (Guest)
on 2007-02-23 16:05
(Received via mailing list)
To do this, you have your ingredients, recipes and cooking_methods
as well as a join table... let's call this recipe_ingredients. This
have foreign key columns, one for each of the other tables.

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

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

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

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,
unknown (Guest)
on 2007-02-23 16:07
(Received via mailing list)
*this would have three foreign key columns, one for each of the other
macarthy (Guest)
on 2007-02-23 16:54
(Received via mailing list)
I'd be interested to see how the and controllers and views should be
constructed for this model

mastica (Guest)
on 2007-02-23 22:13
(Received via mailing list)
Thanks. I'll try that out. I've never gotten such a quick answer from
posting a programming question on any forum before.

mastica (Guest)
on 2007-02-24 13:17
(Received via mailing list)
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

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.

Max M. (Guest)
on 2007-02-26 06:37
(Received via mailing list)
On 2/24/07, mastica <removed_email_address@domain.invalid> wrote:
> keys for recipes/ingredients/cookingmethod...this is clearly
> unnormalized.

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

> 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

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

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

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

class Preparation
  has_and_belongs_to_many :recipes
  belongs_to :ingredient
  belongs_to :cooking_method

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

Jarod R. (Guest)
on 2007-03-12 16:07
(Received via mailing list)
Im getting an error when running an app under fastCGI

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

app works fine under regular cgi.

What would cause this?
This topic is locked and can not be replied to.