· 8 years ago · Apr 14, 2018, 05:48 PM
1require 'rubygems'
2require 'dm-core'
3
4DataMapper::Logger.new(STDOUT, :debug)
5DataMapper.setup(:default, 'sqlite3::memory:')
6
7class Person
8 include DataMapper::Resource
9 property :id, Serial
10 has n, :projects
11 has n, :tasks, :through => :projects
12 # everything works fine if specified like this
13 # has n, :tasks, :through => :projects, :via => :tasks
14end
15
16class Project
17 include DataMapper::Resource
18 property :id, Serial
19 belongs_to :person
20 has n, :tasks
21end
22
23class Task
24 include DataMapper::Resource
25 property :id, Serial
26 belongs_to :project
27end
28
29DataMapper.auto_migrate!
30
31p '-'*80
32
33# use it when you create a child and have the parent object at hand
34person = Person.create
35project = Project.new(:person => person, :tasks => [ Task.new ])
36project.save
37
38# use it in queries
39puts Task.all(:project => project).inspect
40
41
42# Have a look at CREATE TABLE projects, it creates a task_id there which definitely isn't right
43# As a consequence, the creation of a new Project fails because there is no (unneeded) task_id present
44
45# ~ (0.000143) SELECT sqlite_version(*)
46# ~ (0.000105) DROP TABLE IF EXISTS "people"
47# ~ (0.000017) DROP TABLE IF EXISTS "projects"
48# ~ (0.000015) DROP TABLE IF EXISTS "tasks"
49# ~ (0.000024) PRAGMA table_info("people")
50# ~ (0.000361) CREATE TABLE "people" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT)
51# ~ (0.000009) PRAGMA table_info("projects")
52# ~ (0.000113) CREATE TABLE "projects" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "person_id" INTEGER NOT NULL, "task_id" INTEGER NOT NULL)
53# ~ (0.000126) CREATE INDEX "index_projects_task" ON "projects" ("task_id")
54# ~ (0.000096) CREATE INDEX "index_projects_person" ON "projects" ("person_id")
55# ~ (0.000009) PRAGMA table_info("tasks")
56# ~ (0.000107) CREATE TABLE "tasks" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "project_id" INTEGER NOT NULL)
57# ~ (0.000097) CREATE INDEX "index_tasks_project" ON "tasks" ("project_id")
58# "--------------------------------------------------------------------------------"
59# ~ (0.000031) INSERT INTO "people" DEFAULT VALUES
60# ~ projects.task_id may not be NULL (code: 19, sql state: , query: INSERT INTO "projects" ("person_id") VALUES (1), uri: sqlite3://:memory:)
61# /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/adapters/data_objects_adapter.rb:163:in `execute_non_query': projects.task_id may not be NULL (DataObjects::IntegrityError)
62# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/adapters/data_objects_adapter.rb:163:in `execute'
63# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/adapters/data_objects_adapter.rb:267:in `with_connection'
64# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/adapters/data_objects_adapter.rb:161:in `execute'
65# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/adapters/data_objects_adapter.rb:59:in `create'
66# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/adapters/data_objects_adapter.rb:32:in `each'
67# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/adapters/data_objects_adapter.rb:32:in `create'
68# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/repository.rb:129:in `create'
69# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/resource.rb:698:in `hookable___create_nan_before_advised'
70# from /opt/local/lib/ruby/gems/1.8/gems/extlib-0.9.13/lib/extlib/hook.rb:299:in `_create'
71# from /opt/local/lib/ruby/gems/1.8/gems/extlib-0.9.13/lib/extlib/hook.rb:297:in `catch'
72# from /opt/local/lib/ruby/gems/1.8/gems/extlib-0.9.13/lib/extlib/hook.rb:297:in `_create'
73# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/resource.rb:608:in `save_self'
74# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/resource.rb:374:in `save!'
75# from /opt/local/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/resource.rb:358:in `save'
76# from dm-features.rb:34