Создание подклассов DataMapper и само-ссылочные отношения многие-ко-многим - PullRequest
0 голосов
/ 10 декабря 2010

Я создаю небольшое приложение на Ruby с использованием DataMapper и Sinatra и пытаюсь определить базовую модель блога:

  • В блоге несколько пользователей
  • У меня естьколлекция сообщений, каждое из которых публикуется пользователем
  • Каждое сообщение имеет набор комментариев
  • Каждый комментарий может иметь свой собственный набор комментариев - это может повторяться на нескольких уровнях глубиной

У меня возникают проблемы с установкой самореференциальной связи между комментариями из-за того, что каждый комментарий belongs_to представляет собой пост.Мои классы сейчас выглядят так:

class User
  include DataMapper::Resource
  property :id, Serial
  property :username, String
  property :password, String

  has n, :post
end
class Post
  include DataMapper::Resource
  property :id, Serial
  property :content, Text

  belongs_to :user

  has n, :comment
end
class Comment
  include DataMapper::Resource
  property :id, Serial
  property :content, Text

  belongs_to :user
  belongs_to :post
end

Я следую руководству по Ассоциации и создаю новый объект (CommentConnection), чтобы связать два комментария вместе, но моя проблема в том, что каждый подкоммент не должен принадлежать посту, как подразумевается классом Comment.

Моим первым инстинктом было извлечь суперкласс для комментариев, чтобы один подкласс мог быть "верхнего уровня"."и принадлежат сообщению, в то время как другой вид комментария принадлежит другому комментарию.К сожалению, когда я это делаю, я сталкиваюсь с проблемами, когда идентификаторы комментариев становятся нулевыми.

Каков наилучший способ моделирования такого рода рекурсивных отношений комментариев в DataMapper?

1 Ответ

5 голосов
/ 13 января 2011

Что вам нужно, так это самоссылочное соединение в комментариях, например, каждый комментарий может иметь родительский комментарий. Попробуйте следующее:

class Comment
  include DataMapper::Resource
  property :id, Serial
  property :content, Text

  has n, :replies, :child_key => [ :original_id ]
  belongs_to :original,  self, :required => false #Top level comments have none.
  belongs_to :user
  belongs_to :post
end

Это позволит вам получать ответы на любые комментарии, хотя доступ к ним может быть немного неприятным (медленным), если громкость становится высокой. Если вы работаете с этим и хотите что-то более сложное, вы можете посмотреть на вложенные наборы, я думаю, что есть плагин для вложенных наборов для DataMapper, но я не использовал.

...