Я пытаюсь моделировать свою базу данных MongoDB с Mongoid, и пытается создать отношения для следующих отношений:Реферировано 1-N и NN ссылки в Mongoid
- Пользователь может владеть проект
- Проект является принадлежащих пользователя
- Пользователь может быть сотрудником в проекте (но не владелец)
- Проект имеет много соавторов (пользователей)
S o в принципе, пользователь может владеть проектами и сотрудничать с проектом. Это две разные роли. Владелец, Пользователь, через отношения 1-N, может выполнять задачи по проекту. Сотрудник, Пользователь, через отношения N-N, может выполнять отдельный набор задач в проекте.
Решение, которое я придумал это:
# app/models/user.rb
class User
include Mongoid::Document
include Mongoid::Timestamps
field :name, type: String
field :email, type: String
field :username, type: String
has_many :projects
end
# app/models/project.rb
class Project
include Mongoid::Document
include Mongoid::Timestamps
field :title, type: String
field :summary, type: String
field :permalink, type: String
field :collaborator_ids, type: Array, default: []
belongs_to :user
def collaborators
arr = []
self.collaborator_ids.each do |id|
arr << User.find(id)
end
arr
end
end
Это, очевидно, не идеал: есть другой способ сделать это? Я бы предпочел использовать отношения Mongoid has_and_belongs_to_many
вместо ObjectID в массиве, который у меня есть.
Так что же произошло, когда вы пытались HABTM сотрудничать? BTW, ваш метод 'соавторов' может быть просто' User.find (collator_ids) ', не нужно для всех индивидуальных вызовов' find' или ручного массива. –
Почему бы вам просто не создать поле ': owner_id' для каждого проекта и иметь отношения' has_and_belongs_to_many' между моделями 'User' и' Project'. Затем можно создать несколько простых функций, чтобы определить, кто является владельцем проекта, кто является соавторами и т. Д. – alalani
@muistooshort. Между ними существует конфликт, поскольку они оба предназначены для пользователя. И круто, не знаю, я мог бы это сделать. –