Relationships using ActiveRecord
Let's have some colourful fun!
gem install rainbow
require 'rainbow'
Building the SQL
1:Many
CREATE TABLE cows (id SERIAL PRIMARY KEY, farmer_id INTEGER, name VARCHAR(255));
CREATE TABLE farmers (id SERIAL PRIMARY KEY, name VARCHAR(255));
Many:Many
CREATE TABLE travelers (id SERIAL PRIMARY KEY, name VARCHAR(255));
CREATE TABLE vacation_spots (id SERIAL PRIMARY KEY, city VARCHAR(255));
CREATE TABLE visits (id SERIAL PRIMARY KEY, vacation_spot_id INTEGER, traveler_id INTEGER, fun_level INTEGER, timestamp TIMESTAMP);
Many to Many Models
We're going to create two models. They will have a many to many relationship.
Models
# MANY
class VacationSpot < ActiveRecord::Base
has_many :visits
has_many :travelers, :through => :visits
def to_s
self.city + '... The greatest City in the World!'
end
end
# MANY
class Traveler < ActiveRecord::Base
has_many :visits
has_many :vacation_spots, :through => :visits
def to_s
self.name + '... seeing the world!'
end
end
# JOIN
class Visit < ActiveRecord::Base
belongs_to :traveler
belongs_to :vacation_spot
def to_s
self.traveler.to_s + " - visits - " + self.vacation_spot.to_s
end
end
Let's See Our Output
# ---- Examples ----
puts Rainbow("\n***********************************************************************************************").blue
puts Rainbow("*********** What happens in the city stays in the city... cause we have persistance ***********").red
puts Rainbow("***********************************************************************************************").blue
puts Rainbow("\nCreate A Travler:").green
puts Rainbow("lichard = Traveler.create({name: 'Lichard DeGray'})").magenta
lichard = Traveler.create({name: 'Lichard DeGray'})
puts Rainbow("\nCreate A Vacation Spot:").green
puts Rainbow("alp_lake = VacationSpot.create({city: 'Aplville'})").magenta
alp_lake = VacationSpot.create({city: 'Aplville'})
puts Rainbow("\nCreate a visit joining a travler and a vacation spot").green
puts Rainbow("weekend_get_away = Visit.create({traveler: lichard, vacation_spot: alp_lake})").magenta
weekend_get_away = Visit.create({traveler: lichard, vacation_spot: alp_lake})
puts Rainbow("\nTravler:").green
puts Rainbow("puts lichard").magenta
puts lichard
puts Rainbow("\nVaction Spot:").green
puts Rainbow("puts alp_lake").magenta
puts alp_lake
puts Rainbow("\nVisit:").green
puts Rainbow("puts weekend_get_away").magenta
puts weekend_get_away
puts Rainbow("\nTravler's Visits:").green
puts Rainbow("puts lichard.visits").magenta
puts lichard.visits
puts Rainbow("\nTravler's Vacation Spots:").green
puts Rainbow("puts lichard.vacation_spots").magenta
puts lichard.vacation_spots
puts Rainbow("\nVacation Spot's Vists:").green
puts Rainbow("puts alp_lake.visits").magenta
puts alp_lake.visits
puts Rainbow("\nVacation Spot's Travelers:").green
puts Rainbow("puts alp_lake.travelers").magenta
puts alp_lake.travelers
puts Rainbow("\nVisit's Traveler:").green
puts Rainbow("puts weekend_get_away.traveler").magenta
puts weekend_get_away.traveler
puts Rainbow("\nVisit's Vacation Spot:").green
puts Rainbow("puts weekend_get_away.vacation_spot").magenta
puts weekend_get_away.vacation_spot
puts ''
puts Rainbow("*******************************************************").blue
puts Rainbow("*********** Be sure to visit us again soon ***********").red
puts Rainbow("******************************************************").blue
puts ''
1:Many Models
# ** ONE-to-MANY **
# ONE
class Farmer < ActiveRecord::Base
has_many :cows
def to_s
'...and ' + self.name + ' was his/her name... oh'
end
end
# MANY
class Cow < ActiveRecord::Base
belongs_to :farmer
def to_s
self.name + '... moooooooo'
end
end
Let's View Our Code, Again
puts Rainbow("\nCreate A Cow:").green
puts Rainbow("mooooonalisa = Cow.create({name: 'lisa'})").magenta
mooooonalisa = Cow.create({name: 'lisa'})
puts Rainbow("\nCreate A Farmer:").green
puts Rainbow("lichard = Farmer.create({name: 'Lichard DeGray'})").magenta
lichard = Farmer.create({name: 'Lichard DeGray'})
puts Rainbow("\nAssociate the farmer and the cow:").green
puts Rainbow("lichard.cows << mooooonalisa").magenta
lichard.cows << mooooonalisa
puts Rainbow("\nFarmer").green
puts Rainbow("puts lichard").magenta
puts lichard
puts Rainbow("\nFarmer's cows").green
puts Rainbow("puts lichard.cows").magenta
puts lichard.cows