MongoMapper: как создать такую ​​модель

Предположим, у нас есть две модели: Task и User. Таким образом, у пользователя может быть много задач, и у задач также должно быть много пользователей. Но у задачи также должен быть уникальный создатель, который также является пользователем.

Пример:

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

Пользователь_1 создает задачу и становится создателем. User_1 указывает User_2 и User_3 как пользователей, которые должны выполнять задачу. Таким образом, эти два последних пользователя не являются создателями задачи.

Как мне создать эти модели, чтобы, если у меня есть объект задачи, я мог найти его создателя и пользователей, которые должны его выполнить. И как мне сделать, если у меня есть пользователь, чтобы найти все задачи, которые он создал, и все задачи, которые он должен выполнить.


person Laura    schedule 28.11.2011    source источник
comment
возможный дубликат отношений MongoDB для объектов   -  person Ian Mercer    schedule 28.11.2011


Ответы (2)


Вам понадобится связь «многие ко многим» между задачами и пользователями, а также дополнительная связь «один ко многим» между пользователями и задачами, указывающая на создателя (пользователя).

Что-то в этом роде: (я обычно использую Mongoid, поэтому дважды проверьте синтаксис отношений в MongoMapper API — ссылка ниже.. вы можете вручную указать:foreign_key и:class)

Идея состоит в том, что у вас есть два отношения между моделями, одно из которых моделирует отношение «многие ко многим», с помощью которого вы получаете либо assigned_users, либо assigned_tasks, и отношение «один ко многим», с помощью которого вы получаете либо creator из задача или created_tasks для данного пользователя. Если вы выбрали эти имена для отношений, будет ясно, что есть что.

class Task
  include MongoMapper::Document
  key :title, String , :required => true

  key :user_ids , Array
  has_many :users, :in => user_ids     # , :as => :assigned_users

  key :creator_id , ObjectId
  belongs_to: user, :as => :creator

end

class User
  include MongoMapper::Document
  key: name, String, :required => true

  has_many :tasks           # , :as => :assigned_tasks

  has_many :tasks, :as => :created_tasks
end

Видеть:

http://mongomapper.com/documentation/plugins/associations.html

person Tilo    schedule 28.11.2011
comment
Да, вы должны указать :foreign_key и :class. - person Brian Hempel; 29.11.2011

Ответ, предложенный Тило, верен о том, как моделировать данные, но пример кода неверен и не будет работать. Параметр :as предназначен для полиморфных ассоциаций, вы хотите использовать параметр :foreign_key. Кроме того, у вас не может быть двух ассоциаций с одинаковыми именами. См. ниже пересмотренный код.

class Task
  include MongoMapper::Document
  key :title, String , :required => true

  key :assigned_user_ids, Array
  has_many :assigned_users, :in => :assigned_user_ids

  key :creator_id , ObjectId
  belongs_to :creator, :class => User
  # userstamps! also accomplishes the above
end

class User
  include MongoMapper::Document
  key: name, String, :required => true

  has_many :created_tasks, :foreign_key => :creator_id, :class => Task

  # inverse of many :in is still in the works
  # see https://github.com/jnunemaker/mongomapper/pull/259
  # this is a decent workaround for now
  def assigned_tasks 
    Task.where(:assigned_user_ids => self.id)
  end
end

Смотрите также:

person Brian Hempel    schedule 28.11.2011