MongoMapper: как мне создать такую ​​модель - PullRequest
3 голосов
/ 28 ноября 2011

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

Пример:

Задача в этом контексте выглядит так: ИД задачи, Создатель задачи, Пользователи, которые должны выполнятьзадача

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

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

Ответы [ 2 ]

2 голосов
/ 28 ноября 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

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

2 голосов
/ 28 ноября 2011

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

Что-то вроде этого: (я обычно использую Mongoid, поэтому дважды проверьте синтаксис для отношений в API MongoMapper - ссылка ниже .. вы можете указать вручную: foreign_key and: 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

...