Skip to content

Instantly share code, notes, and snippets.

@royw
Created October 3, 2011 22:56
Show Gist options
  • Save royw/1260479 to your computer and use it in GitHub Desktop.
Save royw/1260479 to your computer and use it in GitHub Desktop.
DataMapper query returning duplicates
#!/usr/bin/env ruby
require 'rubygems'
require 'data_mapper'
require 'extlib'
require 'pp'
require 'rspec'
# If you want the logs displayed you have to do this before the call to setup
DataMapper::Logger.new($stdout, :debug)
# An in-memory Sqlite3 connection:
DataMapper.setup(:default, 'sqlite::memory:')
class Project
include DataMapper::Resource
property :id, Serial
property :name, String
property :description, Text
has n, :requirements, :through => DataMapper::Resource
end
class Requirement
include DataMapper::Resource
property :id, Serial
property :name, String
property :description, Text
has n, :projects, :through => DataMapper::Resource
end
DataMapper.auto_migrate!
describe 'associations' do
before :all do
@p1 = Project.create(:name => 'Minion')
@p1.description = 'a fantastic widget'
@r1 = Requirement.create(:name => 'Quality')
@r1.description = 'be the best'
@r1.save
@p1.requirements << @r1
@p1.save
end
it 'should have one requirement for the project' do
@p1.requirements.all.should_not be_empty
@p1.requirements.all.size.should == 1
end
it 'should have one requirement when accessed via all' do
@p1.requirements.all(:description => 'be the best').size.should == 1
@p1.requirements.all.size.should == 1
end
# this one fails
it 'should have one requirement when accessed via first' do
puts "\n\n" + @p1.requirements.all.pretty_inspect + "\n"
@p1.requirements.first.description.should == 'be the best'
puts "\n\n" + @p1.requirements.all.pretty_inspect + "\n"
@p1.requirements.all.size.should == 1
end
end
17:52:10 royw@royw-mbp:~/projects ruby-1.9.2-p180
∴ rspec bug1.rb
DataObjects::URI.new with arguments is deprecated, use a Hash of URI components (/Users/royw/.rvm/gems/ruby-1.9.2-p180/gems/dm-do-adapter-1.1.0/lib/dm-do-adapter/adapter.rb:231:in `new')
~ (0.000224) PRAGMA table_info("projects")
~ (0.000007) PRAGMA table_info("requirements")
~ (0.000047) SELECT sqlite_version(*)
~ (0.000041) DROP TABLE IF EXISTS "projects"
~ (0.000010) PRAGMA table_info("projects")
~ (0.000321) CREATE TABLE "projects" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" VARCHAR(50), "description" TEXT)
~ (0.000013) DROP TABLE IF EXISTS "requirements"
~ (0.000009) PRAGMA table_info("requirements")
~ (0.000084) CREATE TABLE "requirements" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" VARCHAR(50), "description" TEXT)
~ (0.000012) DROP TABLE IF EXISTS "project_requirements"
~ (0.000009) PRAGMA table_info("project_requirements")
~ (0.000124) CREATE TABLE "project_requirements" ("project_id" INTEGER NOT NULL, "requirement_id" INTEGER NOT NULL, PRIMARY KEY("project_id", "requirement_id"))
~ (0.000073) INSERT INTO "projects" ("name") VALUES ('Minion')
~ (0.000032) INSERT INTO "requirements" ("name") VALUES ('Quality')
~ (0.000038) UPDATE "requirements" SET "description" = 'be the best' WHERE "id" = 1
~ (0.000028) UPDATE "projects" SET "description" = 'a fantastic widget' WHERE "id" = 1
~ (0.000039) SELECT "project_id", "requirement_id" FROM "project_requirements" WHERE ("project_id" = 1 AND "requirement_id" = 1) ORDER BY "project_id", "requirement_id" LIMIT 1
~ (0.000031) INSERT INTO "project_requirements" ("project_id", "requirement_id") VALUES (1, 1)
~ (0.000059) SELECT "requirements"."id", "requirements"."name" FROM "requirements" INNER JOIN "project_requirements" ON "requirements"."id" = "project_requirements"."requirement_id" INNER JOIN "projects" ON "project_requirements"."project_id" = "projects"."id" WHERE "project_requirements"."project_id" = 1 GROUP BY "requirements"."id", "requirements"."name" ORDER BY "requirements"."id"
. ~ (0.000065) SELECT "requirements"."id", "requirements"."name" FROM "requirements" INNER JOIN "project_requirements" ON "requirements"."id" = "project_requirements"."requirement_id" INNER JOIN "projects" ON "project_requirements"."project_id" = "projects"."id" WHERE ("project_requirements"."project_id" = 1 AND "requirements"."description" = 'be the best') GROUP BY "requirements"."id", "requirements"."name" ORDER BY "requirements"."id"
~ (0.000055) SELECT "requirements"."id", "requirements"."name" FROM "requirements" INNER JOIN "project_requirements" ON "requirements"."id" = "project_requirements"."requirement_id" INNER JOIN "projects" ON "project_requirements"."project_id" = "projects"."id" WHERE "project_requirements"."project_id" = 1 GROUP BY "requirements"."id", "requirements"."name" ORDER BY "requirements"."id"
. ~ (0.000113) SELECT "requirements"."id", "requirements"."name" FROM "requirements" INNER JOIN "project_requirements" ON "requirements"."id" = "project_requirements"."requirement_id" INNER JOIN "projects" ON "project_requirements"."project_id" = "projects"."id" WHERE "project_requirements"."project_id" = 1 GROUP BY "requirements"."id", "requirements"."name" ORDER BY "requirements"."id"
[#<Requirement @id=1 @name="Quality" @description="be the best">]
~ (0.000054) SELECT "requirements"."id", "requirements"."name" FROM "requirements" INNER JOIN "project_requirements" ON "requirements"."id" = "project_requirements"."requirement_id" INNER JOIN "projects" ON "project_requirements"."project_id" = "projects"."id" WHERE "project_requirements"."project_id" = 1 GROUP BY "requirements"."id", "requirements"."name" ORDER BY "requirements"."id" LIMIT 1
~ (0.000022) SELECT "id", "description" FROM "requirements" WHERE "id" = 1 ORDER BY "id"
~ (0.000050) SELECT "requirements"."id", "requirements"."name" FROM "requirements" INNER JOIN "project_requirements" ON "requirements"."id" = "project_requirements"."requirement_id" INNER JOIN "projects" ON "project_requirements"."project_id" = "projects"."id" WHERE "project_requirements"."project_id" = 1 GROUP BY "requirements"."id", "requirements"."name" ORDER BY "requirements"."id"
[#<Requirement @id=1 @name="Quality" @description="be the best">, #<Requirement @id=1 @name="Quality" @description="be the best">]
~ (0.000053) SELECT "requirements"."id", "requirements"."name" FROM "requirements" INNER JOIN "project_requirements" ON "requirements"."id" = "project_requirements"."requirement_id" INNER JOIN "projects" ON "project_requirements"."project_id" = "projects"."id" WHERE "project_requirements"."project_id" = 1 GROUP BY "requirements"."id", "requirements"."name" ORDER BY "requirements"."id"
F
Failures:
1) associations should have one requirement when accessed via first
Failure/Error: @p1.requirements.all.size.should == 1
expected: 1
got: 2 (using ==)
# ./bug1.rb:62:in `block (2 levels) in <top (required)>'
Finished in 0.02302 seconds
3 examples, 1 failure
Failed examples:
rspec ./bug1.rb:58 # associations should have one requirement when accessed via first
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment