Skip to content

Instantly share code, notes, and snippets.

Created March 25, 2010 17:26
Show Gist options
  • Select an option

  • Save anonymous/343851 to your computer and use it in GitHub Desktop.

Select an option

Save anonymous/343851 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'datamapper'
DataMapper.setup(:default, "sqlite3::memory:")
DataObjects::Sqlite3.logger = DataObjects::Logger.new(STDOUT, 0)
class Master
include DataMapper::Resource
property :id, Serial
property :name, String
has n, :slaves, :model => 'Slave'
end
class Slave
include DataMapper::Resource
property :id, Serial
property :discriminator, Discriminator
belongs_to :master
class Nested < self
property :name, String
end
end
DataMapper.auto_migrate!
sql = <<-SQL
INSERT INTO "masters" ("name") VALUES ('car')
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 1', 1)
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 2', 1)
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 3', 1)
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 4', 1)
SQL
sql.each do |l|
Master.repository.adapter.execute(l)
end
#-------------------------------------------------------------------
# ERROR
# /usr/lib/ruby/gems/1.8/gems/dm-core-0.10.2/lib/dm-core/query.rb:803:
# in `assert_valid_fields_without_operator': +options[:field]+ entry :name does not map to a property in Slave (ArgumentError)
Master.first.slaves.each do |s|
p s.name
end
# THIS WORK FINE:
Master.first.slaves.to_a.each do |s|
p s.name
end
require 'rubygems'
require 'datamapper'
DataMapper.setup(:default, "sqlite3::memory:")
DataObjects::Sqlite3.logger = DataObjects::Logger.new(STDOUT, 0)
class Master
include DataMapper::Resource
property :id, Serial
property :name, String
has n, :slaves, :model => 'Slave'
end
class Slave
include DataMapper::Resource
property :id, Serial
property :discriminator, Discriminator
belongs_to :master
class Nested < self
property :name, String
end
end
DataMapper.auto_migrate!
sql = <<-SQL
INSERT INTO "masters" ("name") VALUES ('car')
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 1', 1)
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 2', 1)
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 3', 1)
INSERT INTO "slaves" ("discriminator", "name", "master_id") VALUES ('Slave::Nested', 'wheel 4', 1)
SQL
sql.each do |l|
Master.repository.adapter.execute(l)
end
#-------------------------------------------------------------------
# Master.first.slaves.each do |s| <------ THIS DOESN'T WORK :/
Master.first.slaves.to_a.each do |s|
p s.name
end
# causes:
#SELECT "id", "name" FROM "masters" ORDER BY "id" LIMIT 1
#SELECT "id", "discriminator", "master_id" FROM "slaves" WHERE ("master_id" = 1 AND "discriminator" IN ('Slave', 'Slave::Nested')) ORDER BY "id"
#SELECT "id", "discriminator", "name" FROM "slaves" WHERE "id" = 1 ORDER BY "id"
#SELECT "id", "discriminator", "name" FROM "slaves" WHERE "id" = 2 ORDER BY "id"
#SELECT "id", "discriminator", "name" FROM "slaves" WHERE "id" = 3 ORDER BY "id"
#SELECT "id", "discriminator", "name" FROM "slaves" WHERE "id" = 4 ORDER BY "id"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment