2014-02-10 13 views
0

Я пытаюсь моделировать свою базу данных 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 в массиве, который у меня есть.

+0

Так что же произошло, когда вы пытались HABTM сотрудничать? BTW, ваш метод 'соавторов' может быть просто' User.find (collator_ids) ', не нужно для всех индивидуальных вызовов' find' или ручного массива. –

+1

Почему бы вам просто не создать поле ': owner_id' для каждого проекта и иметь отношения' has_and_belongs_to_many' между моделями 'User' и' Project'. Затем можно создать несколько простых функций, чтобы определить, кто является владельцем проекта, кто является соавторами и т. Д. – alalani

+0

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

ответ

1

В соответствии с просьбой, я перееду мой комментарий в ответ:

Я рекомендую создать в :owner_id поле для каждого проекта, а затем создать has_and_belongs_to_many отношений между моделями User и Project. Затем создайте несколько простых функций, чтобы определить, кто является владельцем проекта, кто являются соавторами и т. Д.

# 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 :owner_id, type: String 

    has_and_belongs_to_many :users 

    def is_owner?(owner_object) 
    return self.owner_id == owner_object.id 
    end 

    # Add more functions here based on your needs 

end 
Смежные вопросы