Showing posts with label Ruby. Show all posts
Showing posts with label Ruby. Show all posts

Wednesday, January 15, 2014

Ready to deploy my Rails App but there are last minute database changes - how to make everything work.

Sometimes things happen. A last minute change to the underlying database was made a week before I was ready to deploy my Ruby on Rails app. We are talking about terrabytes of data in the database and the change was made for speedy data transformation. This change was neccessary and needed. 

I thought to document this process for future reference. 

Make sure your code is checked into a source code control:

I use git so I would ran:
    git add .
   git commit -m "Snapshot before changing database schema"
   git push origin master

Dropping the current database & loading in the new development database dump:

I am using a MySQL client called Sequel Pro.  It's easy to "delete the database", "add" the database back (with the same database name so I don't have to change my database.yml file).  Then "import" the database dump file. 

     In MySQL admin tool:

        mysql> drop database [database name];
    mysql> create database [databasename];

   Then restore the database from a database dump file:

    #  mysql -u root -p[root_pwd] [database name] < dumpfilename.sql 

Create a new schema.rb file in rails:
  
    rake db:schema:dump
    (you may need to run: bundle exec rake db:schema:dump)



Add, Delete or Update models:

My app reads from the database so I only needed to add new models for the new tables in the database.  For example, if we had a new histories table I created a new file in the models directory:

      projectfolder/app/models/history.rb

Edit the history.rb file and add:

    class History < ActiveRecord::Bas
    end 

The table name is plural and the model name is singular (both are lowercase titles). The object name is capitalized and singular.

Now to work on the controller  to extract data from these new tables...

Monday, December 2, 2013

What is the difference between :name and name: ?

To be honest, I was always confused by name: and :name in Ruby. I never fully understood the differences until I read about it in the Hartl Tutorial.

The Michael Hartl Ruby on Rails Tutorial is an excellent way to learn Ruby on Rails. The tutorial has been updated to Ruby 2.0 and Rails 4.0. I've been working through this tutorial to get updated on the new features and differences in Rails 4.0.

There are several ways to define elements in a hash using a literal representation of key value pairs. We are going to define a hash called pairings that will pair a coffee with a dessert that goes well with this coffee. We will use 3 different ways to assign the key value pairs.

1. Using a string and a hashrocket. The "=>" is called the hashrocket because doesn't it look like one?

  pairings = { "coffee" => "Columbian", "dessert" => "Flan" }

  Use the string as a key in pairings["coffee"] to access the value "Columbian"

2. Using a symbol for the key and a hashrocket. In the previous example the key was the string "coffee". We will replace this string with the symbol :coffee. A symbol is a string without the extra baggage. Ruby will create an almost unlimited number of string instances for all your hash keys, but will only keep one copy of a symbol in memory at a time.

  pairings = { :coffee => "Columbian", :dessert => "Flan" }

  Use the symbol as the key in pairings[:coffee] to access the value "Columbian"

3. "Good Guy" Ruby let's us replace the ":symbol =>" with just 'symbol:'. I kinda miss the hashrocket but I don't miss typing  all those extra characters.

  pairings = { coffee: "Columbian", dessert: "Flan"}

  Use the symbol as the key in pairings[:coffee] to access the value "Columbian"


Easy peasy... the name: syntax simplifies hash construction.
TL;DR Use coffee: to replace ":coffee => " or " 'coffee' => " when creating key value pairs for hashes.