Created
July 17, 2012 05:05
-
-
Save dladowitz/3127283 to your computer and use it in GitHub Desktop.
Active Record Tests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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