Skip to content

Instantly share code, notes, and snippets.

@tenderlove
Created October 14, 2013 20:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tenderlove/6981363 to your computer and use it in GitHub Desktop.
Save tenderlove/6981363 to your computer and use it in GitHub Desktop.
require 'active_record'
ActiveRecord::Base.establish_connection 'sqlite3:///:memory:'
ActiveRecord::Base.connection.instance_eval do
create_table :items
create_table :events do |t|
t.belongs_to :item
end
create_table :event_people do |t|
t.belongs_to :event
t.belongs_to :person
end
create_table :people
end
class Item < ActiveRecord::Base
has_many :events
has_many :event_people, :through => :events
has_many :people, :through => :events
end
class Event < ActiveRecord::Base
belongs_to :item
has_many :event_people
has_many :people, :through => :event_people
end
class EventPerson < ActiveRecord::Base
belongs_to :event
belongs_to :person
end
class Person < ActiveRecord::Base
end
puts "Populating Database"
1000.times { Item.create }
Item.all.each_with_index do |item|
event = Event.new
event.people.build
event.people.build
item.events << event
end
require 'benchmark'
Benchmark.benchmark do |x|
x.report('limit 100 has_many') {
Item.preload(:events).limit(100).order(:id).to_a
}
x.report('limit 100 has_many_through') {
Item.preload(:event_people).limit(100).order(:id).to_a
}
x.report('limit 100 double has_many_through') {
Item.preload(:people).limit(100).order(:id).to_a
}
x.report('limit 1000 has_many') {
Item.preload(:events).limit(1000).order(:id).to_a
}
x.report('limit 1000 has_many_through') {
Item.preload(:event_people).limit(1000).order(:id).to_a
}
x.report('limit 1000 double has_many_through') {
Item.preload(:people).limit(1000).order(:id).to_a
}
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment