How to reload schema.rb in rails app? - ruby-on-rails

I currently have a few migrations which were created when I initially created models using rails generate model. I've run those migrations and successfully updated the database.
I've then made some changes to these migrations (not added new ones) because they were very small changes like a new column, or making a column unique, or adding an index.
But, even when I reset my db and run all migrations again, rails is insisting on using an outdated schema.rb file.
What should I be doing? How do I force a reload of this schema.rb?

Provided you haven't pushed the code to production you can run rake db:rollback then rake db:migrate to drop and recreate the tables.

Use this:
rake db:drop db:create db:migrate

Related

Ruby on rails updating model via rails console

I have run rails g model Task description:text. Then I have run rails console and put in a few tasks. I would now like to add more attributes to the create_tasks.rb file. Such as .string :title.
What I tried:
opened the file(create_tasks.rb), put the new line in. Then ran rake
db:migrate then went back into the console and opened the first task
and it doesn't show the title attribute.
also tried creating a new task using the title attribute. Error:
unknown title attribute for Task.
So, how do I update the model?
Welcome to Rails!
Here you can find some tutorials about how to deal with migrations:
http://edgeguides.rubyonrails.org/active_record_migrations.html
https://www.tutorialspoint.com/ruby-on-rails/rails-migrations.htm
Basically, every time you want to modify a migration, you must:
run rake db:rollback
modify the migration
run rake db:migrate
I hope this helps. Good coding!!
You need to rails db:rollback to roll the database back before the latest migration, add the new variables to the migration file, then run rails db:migrate to have the new parts of the migration file included.
If you need to roll back more revisions (if you have created more migrations since you created this model), you can either include the number of roll backs like
rails db:rollback STEP=<enter number of steps>
#e.g. rails db:rollback STEP=2
or, you could also rails db:reset which would remove all databases, recreate them, then remigrate them. Or you could rails db:drop to drop the database, then rails db:create and rails db:migrate to migrate the new database.
Do not edit the schema file. The schema file is automatically updated when you run migrations etc to match the content of your migration files.

Rake db:drop not working?

I have unseen duplicate relations and tables and I am trying to destroy my entire DB and reset out of pure frustration, and I can't even do that. When I run rake db:drop or reset, everything is still there in my schema and migrations. How do I kill this entire DB and build it over again?
While they are closely related, migration files/schema.rb are not the same thing as the database. rake db:drop doesn't delete the migration files or the schema because people may wish to easily recreate their entire database while maintaining the information on how the database was built (ie the migration files).
If you want to start from scratch, drop the database rake db:drop and manually delete the migration files (schema will be overwritten when you create your new migrations).
If you do
rake db:rollback STEP=100
That will revert the last 100 migrations (so take you to zero state)

How to get back the tables in SQLite

I'm beginner in Ruby on Rails. I dropped my table. But I have the files in the db/migrate folder. How can I get back my table from those migrate files?
The ideal way to do this, is using
rake db:setup
This will recreate the database and load the schema into the development database. With every migration rails keeps the current state of the database in schema.rb (or structure.sql), and it uses those to efficiently recreate the last state.
If you have pending migrations, you will have to do rake db:migrate, but this will take more time, since it will redo every step as before.
Also note in some cases it is not possible to run the migrations from the start again, and imho that is not the intention of the migrations.
Run rake db:migrate to get it back.
According to this question, you should be able to do the following:
rake db:create #-> creates DB based on the schema file
rake db:migrate #-> populates the db with the various changes in the migrations
If you follow these steps, with nathanvda's advice, you should be able to solve the issue you're seeing!

exactly what does rake db:migrate do?

Does rake db:migrate only add new migrations, or does it drop all migrations/changes and build everything new?
I think rake is throwing an error because it is trying to access a table attribute in migration 040 that was deleted in migration 042. somehow my DB and rake are out of synch and I want to fix them.
for you experts out there - is it common for rake to get out of synch with migrations? how can I avoid this (no, I do not hand-edit my schema or rake files).
When you use rails migrations, a table called schema_migrations is automatically created, which keeps track of what migrations have been applied, by storing the version number of each migration (this is the number that prefaces the migration name in the file name, ie db/migrate/_20090617111204__migration.rb). When you run rake db:migrate to migrate up, only migrations which have not been run previously (ie. their version is not contained in the table) will be run (for this reason, changing a migration that's already been executed will have no effect when running db:migrate). When migrating down, all versions found in schema_migrations that are greater than the version you are rolling back to will be undone.
Everytime you create a migration using scripts (like script/generate model ...) a new migration is added to the correct directory ready to be synched with the real database.
Actually rake db:migrate just checks which missing migrations still need to be applied to the database without caring about the previouse ones.
Of course if you modify the database using other ways is common to obtain out-of-synch things because as you said you can find yourself applying a migration to something that is changed underneath.
A migration means that you move from the current version to a newer version (as is said in the first answer). Using rake db:migrate you can apply any new changes to your schema. But if you want to rollback to a previous migration you can use rake db:rollback to nullify your new changes if they are incorrectly defined. Caution: by doing so your data will be lost.

how to avoid a faulty rollback migration in ruby?

i have a bug in a "self.drop" in a migration such that I cannot roll back past that migration. how can i start from scratch and build up from migration 001? also, is there a way to do this without losing my data (it's just testing, but still...)
You can comment all statements in self.down migration and rollback to previous db version.
Then apply changes by hand using a gui/web db client to match db schema before migration.
After you will be able to run migration again and your data will not be lost.
rake db:drop
rake db:create
rake db:migrate
It will reset your database and run all migrations. If you don't want to lose your data you can save it using plugin yaml_db:
rake db:data:dump # stores all data in db/data.yml
...
rake db:data:load # loads db/data.yml to database
If you have an error in a migration you can edit it and then try to rollback.
I realise this is an old question, but imho still relevant. If you want to recreate your database from scratch, one does not rollback and rerun migration, one just does
rake db:setup
This will drop, create and fill the database with the current combined state of all the migrations. This is because, definitely in a large system, running all the migrations might no longer work. However, running the schema.rb will always work.
My advice would also be to avoid rollback of migrations as much as possible, unless when you just created a migration and want to make some addition/typo/fix, before having pushed the migration to your team or any deployment.

Resources