Changing database structure without wiping


#1

I’ve decided to make a major change in my application which affects
more than 1 model. I don’t want to wipe all the data though. Here’s
the scenario I’m in:

I have a Book model with a Chapter model. Book has many Chapters and
Chapter belongs to Book. However, I want to add a Story model between
them so that Book has many Stories and Stories has many Chapters. Is
there a way I can make this change without wiping all my data?


#2

What you’re asking should be totally doable via Migrations. See
http://guides.rubyonrails.org/migrations.html.

Basically your flow should look something like:

  1. Create stories table.
  2. Add column chapters.story_id.
  3. Find all chapters.
  4. For each chapter:
    • Find or create the matching story. (Find params will depend on
      structure of story and chapter.)
    • story.book = chapter.book
    • chapter.story = story
    • chapter.book = nil
    1. Remove column chapters.book_id.

Could also write a one-off script to do this if you’re more comfortable,
but
leveraging ActiveRecord in this case will make life easier no matter
where
you decide to implement it.

HTH.