Report abuse

require "rubygems"
require "dm-core"
require "dm-aggregates"
require "randexp"

module Integrity
  class Project
    include DataMapper::Resource

    property :id, Serial
    property :name, String, :nullable => false

    has n, :commits, :model => "Integrity::Commit"
  end

  class Commit
    include DataMapper::Resource

    property :id, Serial
    property :identifier, String, :nullable => false

    has 1, :build, :model => "Integrity::Build"

    belongs_to :project, :model => "Integrity::Project",
                         :child_key => [:project_id]
  end

  class Build
    include DataMapper::Resource

    property :id, Serial
    property :output, Text, :default => ""

    belongs_to :commit, :model => "Integrity::Commit",
                        :child_key => [:commit_id]
  end
end

DataMapper::Logger.new(STDOUT, :debug)
DataMapper.setup(:default, "sqlite3::memory:")
DataMapper.auto_migrate!

project = Integrity::Project.create(:name => "My Project")
100.times {
  project.commits << Integrity::Commit.new(:identifier => "f59dd24",
    :build => Integrity::Build.new(:output => /[:sentence:]/.gen))
  project.save
}
idx = 0
Integrity::Project.get(1).commits.each do |c|
  idx += 1
  puts "idx = #{idx}, #{c.build.output}"
end

# performs 100 SELECTs and ends with a nil access

#  ~ (0.000030) SELECT "id", "commit_id" FROM "integrity_builds" WHERE "commit_id" = 98 ORDER BY "id" LIMIT 1
#  ~ (0.000030) SELECT "id", "output" FROM "integrity_builds" WHERE "commit_id" = 98 ORDER BY "id" LIMIT 1
# idx = 98, Tricarpellary smalt potorous superextend nonconspirator fork bookdom brasque voltameter concernment gentleship aeronat
# DataMapper::Associations::OneToMany::Collection#build is deprecated, use DataMapper::Associations::OneToMany::Collection#new instead (/opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/associations/one_to_many.rb:152:in `send')
#  ~ (0.000029) SELECT "id", "commit_id" FROM "integrity_builds" WHERE "commit_id" = 99 ORDER BY "id" LIMIT 1
#  ~ (0.000029) SELECT "id", "output" FROM "integrity_builds" WHERE "commit_id" = 99 ORDER BY "id" LIMIT 1
# idx = 99, Gavel insatiate micropia sacerdotalize talloel saltpetrous institutionalism outweave notch tum permalloy malodorousness equal paramount histaminase sucivilized
# DataMapper::Associations::OneToMany::Collection#build is deprecated, use DataMapper::Associations::OneToMany::Collection#new instead (/opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/associations/one_to_many.rb:152:in `send')
#  ~ (0.000036) SELECT "id", "commit_id" FROM "integrity_builds" WHERE "commit_id" = 100 ORDER BY "id" LIMIT 1
#  ~ (0.000030) SELECT "id", "output" FROM "integrity_builds" WHERE "commit_id" = 100 ORDER BY "id" LIMIT 1
# idx = 100, Tetradic uninflammable lionet phthiocol unhumble resatisfy tumultuation
# sr.rb:52: undefined method `output' for nil:NilClass (NoMethodError)
#   from /opt/local/lib/ruby/gems/1.8/gems/extlib-0.9.13/lib/extlib/lazy_array.rb:458:in `each'
#   from /opt/local/lib/ruby/gems/1.8/gems/extlib-0.9.13/lib/extlib/lazy_array.rb:458:in `each'
#   from sr.rb:50