require 'pg' class Instructor # These are my database credentials. You'll need to replace them with yours. CONN = PG::Connection.new({ host: 'localhost', user: 'postgres', password: 'postgres', dbname: 'ormlecture' }) attr_accessor :name, :coolness attr_reader :id def initialize(name, coolness, id=nil) @name = name @coolness = coolness @id = id end def is_new? @id.nil? end def valid? @coolness > 9000 end def save raise 'Invalid Instructor!' unless valid? if is_new? result = CONN.exec_params('INSERT INTO instructors (name, coolness) VALUES ($1, $2) returning id', [@name, @coolness]) @id = result[0]['id'] else CONN.exec_params('UPDATE instructors SET name = $1, coolness = $2 WHERE id = $3', [@name, @coolness, @id]) end end def destroy CONN.exec_params('DELETE FROM instructors WHERE id = $1', [@id]) end ## DANGER Below is wet wet code. It's up to you to DRY it out and make it more succinct. def self.find(id) result = nil CONN.exec_params('SELECT id, name, coolness FROM instructors WHERE id = $1 LIMIT 1', [id]) do |rows| rows.each do |row| result = Instructor.new( row['name'], row['coolness'], row['id'] ) end end result end def self.all results = [] CONN.exec_params('SELECT id, name, coolness FROM instructors') do |rows| rows.each do |row| results << Instructor.new( row['name'], row['coolness'], row['id'] ) end end results end def self.where_coolness_above(coolness) results = [] CONN.exec_params('SELECT id, name, coolness FROM instructors WHERE coolness > $1', [coolness]) do |rows| rows.each do |row| results << Instructor.new( row['name'], row['coolness'], row['id'] ) end end results end end