Skip to content

Instantly share code, notes, and snippets.

@nevir
Created May 2, 2011 22:53
Show Gist options
  • Save nevir/952528 to your computer and use it in GitHub Desktop.
Save nevir/952528 to your computer and use it in GitHub Desktop.
DataMapper join tables
require 'rubygems'
require 'dm-core'
require 'dm-migrations'
require 'dm-mysql-adapter'
require 'ffaker'
require 'benchmark'
logger = DataMapper::Logger.new(STDOUT, :debug)
DataMapper.setup(:default, 'mysql://dm:dm@localhost/dm_join_tables')
class Left
include DataMapper::Resource
property :id, Serial
has n, :joins
has n, :rights, :through => :joins
end
class Join
include DataMapper::Resource
belongs_to :left, :key => true
belongs_to :right, :key => true
end
class Right
include DataMapper::Resource
property :id, Serial
property :one, String
property :two, Integer
property :three, Text
end
DataMapper.finalize
unless ARGV.include? '--only-queries'
DataMapper.auto_migrate!
puts '==================================='
logger.level = DataMapper::Logger::Levels[:warn]
1000.times do |i|
Right.create :one => 'foo', :two => i, :three => Faker::Lorem.paragraphs(10)
end
all_rights = Right.all.to_a
1000.times do |i|
Left.create :rights => (rand * 10).to_i.times.map {|i| all_rights.sample}
end
logger.level = DataMapper::Logger::Levels[:debug]
end
puts '==================================='
logger.level = DataMapper::Logger::Levels[:warn]
n = 5000
Benchmark.bm(10) do |x|
x.report('single: ') { n.times {Left.first.rights.to_a} }
x.report('split: ') { n.times {Left.first.joins.rights.to_a} }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment