(Newb alert) One-to-many...

Hey! I’m decent at Ruby, but pretty darn new to Rails. Working through some tutorial stuff, and don’t fully understand what direction to take. I want to create a one-to-many association; how do I accomplish this? Do I create the association with MySQL (the DB I’m using) first, and then just have Rails take advantage of it? Do I use “migration” (which I only kinda-sorta “get”)? Or is there some other mechanism entirely?

Apologies for how dumb this probably sounds; trying to get the full feel of Rails, and there are definitely some places I’m still not quite understanding the concepts.



Have you read these?

  Active Record Associations — Ruby on Rails Guides   Active Record Migrations — Ruby on Rails Guides

In general you should make changes to your DB through migrations only, so you can reverse, repeat, insure identical changes are made to other (deployment) systems, etc.

Work right through a good tutorial such as railstutorial.org (free to use online) and all the basics (including associations) will become clear.


Example: an owner has many cats.

In your Cat model, add the line:

belongs_to :owner

in your Owner model, add the line:

has_many :cats

You then need to run a migration on your cats table, to add the foreign key for owners, so Rails can build the associations. From the command line:

rails g migration add_owner_id_to_cats owner_id:integer

This should create a migration file (in the /db folder), with something like the following in it:

class AddFooToPosts < ActiveRecord::Migration

def change

add_column :cats, :owner_id, :integer # ie, table, field name, field type



then, run your migration.

rake db:migrate

Thanks to the convention over configuration approach, rails will automagically work out that owner_id is a foreign key to the owners table. from there, you’ll be able to access cats through owners, and owners through cats:

mog.owner # “Steve”

steve.cats.first # “Mog”

That, of course, is just the tip of the iceberg - you can define all kinds of odd relations, and customise them as much as you want.


NB: AddFooToPosts would be AddOwnerIdToCats, I just messed up the copy paste.