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

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
828d8cff5a9d8854b3f56569022c8e50?d=identicon&s=25 mastica (Guest)
on 2007-02-23 11: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,
cookingmethod_id

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

Thanks,

Gerry
933c05ef3dbe1454bd213bc08777ef63?d=identicon&s=25 macarthy (Guest)
on 2007-02-23 12:13
(Received via mailing list)
I'm, looking at something similar, try this
(http://groups.google.com/group/rubyonrails-talk/br...
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
D5145c421cd25af6fa577c15219add90?d=identicon&s=25 unknown (Guest)
on 2007-02-23 15:05
(Received via mailing list)
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
D5145c421cd25af6fa577c15219add90?d=identicon&s=25 unknown (Guest)
on 2007-02-23 15:07
(Received via mailing list)
*this would have three foreign key columns, one for each of the other
tables.
933c05ef3dbe1454bd213bc08777ef63?d=identicon&s=25 macarthy (Guest)
on 2007-02-23 15:54
(Received via mailing list)
I'd be interested to see how the and controllers and views should be
constructed for this model

J
828d8cff5a9d8854b3f56569022c8e50?d=identicon&s=25 mastica (Guest)
on 2007-02-23 21: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.

Gerry
828d8cff5a9d8854b3f56569022c8e50?d=identicon&s=25 mastica (Guest)
on 2007-02-24 12: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
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
E6a1fe85299e663566dd1ea7d4f74e76?d=identicon&s=25 Max Muermann (Guest)
on 2007-02-26 05:37
(Received via mailing list)
On 2/24/07, mastica <mastica@gmail.com> 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
7eed1b4c2c0e57d73594780eb10d8bba?d=identicon&s=25 Jarod Reid (Guest)
on 2007-03-12 15: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
readable

app works fine under regular cgi.


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