DataMapper: несколько отношений «имеет и принадлежит ко многим» между одними и теми же моделями?

Как настроить несколько отношений типа has n, :through => Resource между одними и теми же моделями с помощью DataMapper?

Например, в новостной CMS у меня было бы что-то вроде этого:

class User
  include DataMapper::Resource

  has n, :written_articles, 'Article', :through => Resource
  has n, :edited_articles, 'Article', :through => Resource

  property :name, String # etc.
end

class Article
  include DataMapper::Resource

  has n, :authors, 'User', :through => Resource
  has n, :editors, 'User', :through => Resource

  property :title, String # etc.
end

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

Как я могу сделать что-то подобное?


person David Kendal    schedule 29.03.2012    source источник


Ответы (1)


Вы не можете сделать это с помощью анонимного ресурса - предоставленный вами код создаст единую реляционную модель UserArticle, которая не может обрабатывать два отношения "многие ко многим" (по крайней мере, автоматически). Вам нужно будет создать отдельную явную реляционную модель, например, ArticleEditor, чтобы справиться с этим.

class ArticleEditor
  include DataMapper::Resource

  belongs_to :article,   :key => true
  belongs_to :user, :key => true
end

и в состоянии ваших моделей

 has n, :article_editors
 has n, :editors (or :edited_articles), :through => :article_editors
person UncleGene    schedule 29.03.2012