· 8 years ago · May 03, 2018, 06:32 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 property :name , String, :required => true
11 has n, :friendships, :child_key => [:source_id]
12 has n, :friends, self, :through => :friendships, :via => :target
13end
14
15class Friendship
16 include DataMapper::Resource
17 belongs_to :source, 'Person', :key => true
18 belongs_to :target, 'Person', :key => true
19end
20
21DataMapper.auto_migrate!
22
23Person.create(:name => 'Fry', :friends => [
24 Person.create(:name => 'Bender'), # you can also just call Person.new
25 Person.create(:name => 'Leela') # you can also just call Person.new
26])
27
28puts "Fry's friends: #{Person.first(:name => 'Fry').friends.map(&:name).join(',')}"
29
30__END__
31
32ree-1.8.7-2010.01 mungo:snippets snusnu$ ruby srmtm.rb
33 ~ (0.000040) SELECT sqlite_version(*)
34 ~ (0.000056) DROP TABLE IF EXISTS "people"
35 ~ (0.000019) DROP TABLE IF EXISTS "friendships"
36 ~ (0.000011) PRAGMA table_info("people")
37 ~ (0.000261) CREATE TABLE "people" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" VARCHAR(50) NOT NULL)
38 ~ (0.000008) PRAGMA table_info("friendships")
39 ~ (0.000126) CREATE TABLE "friendships" ("target_id" INTEGER NOT NULL, "source_id" INTEGER NOT NULL, PRIMARY KEY("target_id", "source_id"))
40 ~ (0.000080) CREATE INDEX "index_friendships_source" ON "friendships" ("source_id")
41 ~ (0.000076) CREATE INDEX "index_friendships_target" ON "friendships" ("target_id")
42 ~ (0.000033) INSERT INTO "people" ("name") VALUES ('Bender')
43 ~ (0.000034) INSERT INTO "people" ("name") VALUES ('Leela')
44 ~ (0.000052) INSERT INTO "people" ("name") VALUES ('Fry')
45 ~ (0.000064) SELECT "target_id", "source_id" FROM "friendships" WHERE ("target_id" = 1 AND "source_id" = 3) ORDER BY "target_id", "source_id" LIMIT 1
46 ~ (0.000079) INSERT INTO "friendships" ("target_id", "source_id") VALUES (1, 3)
47 ~ (0.000062) SELECT "target_id", "source_id" FROM "friendships" WHERE ("target_id" = 2 AND "source_id" = 3) ORDER BY "target_id", "source_id" LIMIT 1
48 ~ (0.000062) INSERT INTO "friendships" ("target_id", "source_id") VALUES (2, 3)
49 ~ (0.000040) SELECT "id", "name" FROM "people" WHERE "name" = 'Fry' ORDER BY "id" LIMIT 1
50 ~ (0.000124) SELECT "people"."id", "people"."name" FROM "people" INNER JOIN "friendships" ON "people"."id" = "friendships"."target_id" INNER JOIN "people" "people_1" ON "friendships"."source_id" = "people_1"."id" WHERE "friendships"."source_id" = 3 GROUP BY "people"."id", "people"."name" ORDER BY "people"."id"
51Fry's friends: Bender,Leela