class A
include DataMapper::Resource
def self.default_repository_name
:alt_db
end
property :aid, Integer, :key => true
# other stuff
belongs_to :b, :model => 'B', :child_key => [ :bid ]
end
class B
include DataMapper::Resource
# this one is in the default repo
property :bid, Integer, :key => true
# other stuff
belongs_to :c, :model => 'C', :child_key => [ :cid ]
end
class C
include DataMapper::Resource
# this one is in the default repo
property :cid, Integer, :key => true
# other stuff
end
Если у меня есть только A и B, это отлично работает. Однако, если я добавлю C, я получу ошибку:
dm-core / model / property.rb: 73: в "новом": неверное количество аргументов (4 для 3) (ArgumentError)
Если я хочу создать цепочку отношений с DataMapper, чтобы я мог дать идентификатор в одном месте и получить фрагмент данных, который, скажем, в четырех таблицах, через серию ссылок на идентификатор первичного ключа последующих таблиц поле, как я могу это сделать?
РЕДАКТИРОВАТЬ: копание в источник DM от трассировки стека:
DataMapper.repository(other_repository_name) do
properties << klass.new(self, name, options, type)
end
Вот здесь и возникает ошибка. Действительно, в этом случае klass является свойством DataMapper Integer, и его метод инициализации принимает только три параметра (модель, имя и хэш параметров).
Весь этот блок выполняется только потому, что я использую более одного репозитория, хотя B и C находятся в одном и том же, так что я не знаю, проливает ли это какой-либо свет на то, почему происходит сбой свойства cid. *
EDIT2:
Я перепробовал все перестановки, и кажется, что когда вы соединяетесь в цепочку, когда вы пересекаете границу базы данных, это должен быть конец цепочки. Например, поскольку A - это: alt_db, а B -: по умолчанию, B настолько глубока, насколько я могу понять, независимо от того, является ли C: default,: alt_db или третьим вариантом.
Если бы вместо этого A и B были: default или оба были: alt_db, а затем C были противоположными, C был бы настолько глубоким, насколько я мог.
Я, правда, не понимаю этого поведения.