I've got myself quite mixed up on has_many and related issues.
Suppose I have a lot of Recipes, each of which is to have many Ingredients.
I think I am meant to do e.g. models/recipe.rb
class Recipe < ActiveRecord::Base has_many :ingredients end
along with models/ingredient.rb
class Ingredient < ActiveRecord::Base belongs_to :recipe end
Is that right, with the has_many and belongs_to, with the plurality and use of upper and lower case?
Now I come to my real confusion. I half-think I should create a model "Recipes_Ingredients", but I'm not sure on that, so I've not done it.
What I *have* done is to create a table in one of my migrations, viz
class RecipesIngredients < ActiveRecord::Migration def self.up create_table :recipes_ingredients, :id => false do |t| t.column :ingredient_id, :integer t.column :recipe_id, :integer end add_index :recipes_ingredients, [:ingredient_id, :recipe_id] add_index :recipes_ingredients, :recipe_id end def self.down drop_table :recipes_ingredients end end
but is this enough? Am I supposed to use "execute" lines to make up foreign keys, or will this do what I need?
I think that what I've done is insufficient, because no method recipe.ingredient seems to have been created. (Hm... is there a way to make the system describe the methods it's creating, during migration and otherwise?)
PS. I note that the Roll-With Revisited tutorial http://www.onlamp.com/ pub/a/onlamp/2006/12/14/revisiting-ruby-on-rails-revisited.html? page=2 illustrates the use of MYSQL code
constraint fk_recipes_categories foreign key (category_id) references categories(id), primary key(id)
but I'm hoping to avoid hand injection of MySQL. (If I wanted to work with MySQL directly, I'd be back with PHP!)
Well, I hope I've been clear. As readers may guess, I'm not really working on recipes and ingredients, so I hope I've done tthe conversion to these more evocative names correctly enough that my point is clear.
PS. I'm using the new RoR, with MySQL.