Skip to content

Instantly share code, notes, and snippets.

@yokolet
Created March 24, 2012 00:34
Show Gist options
  • Select an option

  • Save yokolet/2176753 to your computer and use it in GitHub Desktop.

Select an option

Save yokolet/2176753 to your computer and use it in GitHub Desktop.
Rails 3: How to add a new field to an existing database table
Existing schema is below:
ActiveRecord::Schema.define(:version => 20120130161449) do
create_table "movies", :force => true do |t|
t.string "title"
t.string "rating"
t.text "description"
t.datetime "release_date"
t.datetime "created_at"
t.datetime "updated_at"
end
end
To add new field "director" to this schema, I created Migration by:
rails g migration AddDirectorToMovie director:string
The name "AddDirectorToMovie" means much. "Add" creates "change" method in Migration, and "ToMovie" indicates the table concerned about is "movies."
So, I got a migration file, db/migrate/20120323210944_add_director_to_movie.rb whose contents is:
class AddDirectorToMovie < ActiveRecord::Migration
def change
add_column :movies, :director, :string
end
end
One last thing to do is:
rake db:migrate
Now, I have an updated schema.rb:
ActiveRecord::Schema.define(:version => 20120323210944) do
create_table "movies", :force => true do |t|
t.string "title"
t.string "rating"
t.text "description"
t.datetime "release_date"
t.datetime "created_at"
t.datetime "updated_at"
t.string "director"
end
end
Also, I could confirm the "director" field was added on Rails console:
1.9.2p290 :012 > Movie.columns.map {|c| c.name}
=> ["id", "title", "rating", "description", "release_date", "created_at", "updated_at", "director"]
@zachguo
Copy link
Copy Markdown

zachguo commented Aug 19, 2013

Could you please tell me why it doesn't work if I add the change method directly into db/migrate/20111119180638_create_movies.rb?

class CreateMovies < ActiveRecord::Migration
  def up
    create_table :movies do |t|
      t.string :title
      t.string :rating
      t.text :description
      t.datetime :release_date
      t.timestamps
    end
  end

  def change
    add_column :movies, :director, :string
  end

  def down
    drop_table :movies
  end
end

@AWizardIsNeverLate
Copy link
Copy Markdown

Thank you! This worked for me.

@pdhakad
Copy link
Copy Markdown

pdhakad commented Aug 27, 2014

It really works ...

@howardpang28
Copy link
Copy Markdown

thanks!

@dianaaparicio
Copy link
Copy Markdown

thanks! ๐Ÿ‘ ๐Ÿ˜„

@LookOnTheBrightSide
Copy link
Copy Markdown

thanks!

@SidMasih
Copy link
Copy Markdown

SidMasih commented Oct 6, 2016

Thank You!

@rchrdchn
Copy link
Copy Markdown

Thank you!

@yourstayonline
Copy link
Copy Markdown

Wooo! Still works on Rails 5.2.3 in 2021!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment