Цепочка связей datamapper в разных репозиториях - PullRequest
0 голосов
/ 21 апреля 2011
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 был бы настолько глубоким, насколько я мог.

Я, правда, не понимаю этого поведения.

Ответы [ 3 ]

1 голос
/ 22 апреля 2011

На самом деле вы нашли ошибку. Это было исправлено в мастере. Вы можете попробовать получить исходники из git и посмотреть, работает ли он.

0 голосов
/ 22 апреля 2011

Оказывается, это была небольшая проблема с цепочкой DataMapper между репозиториями. Представлено им, и это якобы уже исправлено!

http://datamapper.lighthouseapp.com/projects/20609/tickets/1506-can-only-chain-up-to-first-time-changing-default-repository#ticket-1506-1

0 голосов
/ 21 апреля 2011

Ваш код отлично работает для меня.

irb(main):001:0> A.first.b.c
  DEBUG - "(0.001168) SELECT "aid", "bid" FROM "as" ORDER BY "aid" LIMIT 1"
  DEBUG - "(0.000337) SELECT "bid", "cid" FROM "bs" WHERE "bid" = 2 LIMIT 1"
  DEBUG - "(0.000046) SELECT "cid" FROM "cs" WHERE "cid" = 3 LIMIT 1"
=> #<C @cid=3>

Мой драгоценный камень dm-core-1.1.0, вы должны проверить свою версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...