Skip to content

Instantly share code, notes, and snippets.

@dladowitz
Created July 17, 2012 05:05
Show Gist options
  • Save dladowitz/3127283 to your computer and use it in GitHub Desktop.
Save dladowitz/3127283 to your computer and use it in GitHub Desktop.
Active Record Tests
require 'active_record'
require 'sqlite3'
require 'logger'
# ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Base.establish_connection :adapter => 'sqlite3',
:database => 'address_book.db'
ActiveRecord::Base.connection.execute <<-SQL
-- Address book schema
CREATE TABLE IF NOT EXISTS contacts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name VARCHAR,
last_name VARCHAR,
birthday DATE,
email VARCHAR,
phone VARCHAR,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL
);
SQL
ActiveRecord::Base.connection.execute <<-SQL
CREATE TABLE IF NOT EXISTS addresses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
contact_id INTEGER NOT NULL,
street_address VARCHAR,
street_address2 VARCHAR,
city VARCHAR,
state VARCHAR,
country VARCHAR,
zip VARCHAR,
FOREIGN KEY (contact_id) REFERENCES contacts(id)
);
SQL
class Contact < ActiveRecord::Base
has_many :addresses
end
class Address < ActiveRecord::Base
belongs_to :contact
end
Contact.delete_all
Address.delete_all
david = Contact.create(:first_name => 'David', :last_name => 'Ladowitz')
david.addresses.create(:state => 'CA')
david.addresses.create(:state => 'MI')
david.addresses.create(:state => 'CA')
david = Contact.create(:first_name => 'Sherief', :last_name => 'Gharraph')
david.addresses.create(:state => 'OH')
david.addresses.create(:state => 'HI')
david = Contact.create(:first_name => 'Andrew', :last_name => 'Gharraph')
david.addresses.create(:state => 'CA')
david.addresses.create(:state => 'HI')
Contact.all.each { |contact| p contact; puts "----------------" }
Address.all.each { |address| p address; puts "----------------" }
Address.where(:state => "CA").each {|record| puts "#{record.contact.first_name} has a CA address at:\n #{record.inspect}" ; puts "" }
Contact.where("first_name LIKE 'A%' ").each {|record| puts " #{record.first_name} has a CA address of :\n" ; p record.addresses }
# each { |address| puts address.inspect} ; puts "" }
# Contact.where("first_name LIKE 'A%' ").each {|record| puts "stuff"}
# 10.times do
# david = Contact.create(:first_name => 'Aaron', :last_name => 'Lin')
# david.addresses.create(:state => 'LA')
# david.addresses.create(:state => 'CA')
# david.addresses.create(:state => 'OK')
# end
# puts "----\n"
# puts "N+1 bug"
#
# Contact.where("first_name LIKE 'A%'").each do |contact|
# puts "In da loop!"
# p contact.addresses
# end
#
# puts "----\n"
# puts "2 queries"
#
# Contact.includes(:addresses).where("first_name LIKE 'A%'").each do |contact|
# puts "In da loop!"
# puts contact.addresses.first.state
# end
#
# puts "----\n"
# puts "1 query (a single join)"
#
# Contact.joins(:addresses).includes(:addresses).where("first_name LIKE 'A%'").each do |contact|
# puts "In da loop!"
# contact.addresses.inspect
# end
# SELECT * FROM contacts WHERE first_name LIKE 'A%'
# SELECT * FROM addresses WHERE contact_id = ?
# SELECT * FROM contacts JOIN addresses ON contacts.id = addresses.contact_id WHERE contacts.first_name LIKE 'A%'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment