参考1-N并在Mongoid中引用N-N.

时间:2014-02-10 16:27:31

标签: mongodb mongoid data-modeling

我正在尝试使用Mongoid为我的MongoDB数据库建模,并尝试为以下关系创建关系:

  • 用户可以拥有项目
  • 项目归用户所有
  • 用户可以是项目中的协作者(但不是所有者)
  • 项目有很多合作者(用户)

基本上,用户可以拥有项目并在项目上进行协作。这是两个不同的角色。拥有者,用户,通过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关系而不是我拥有的数组hack中的ObjectID。

1 个答案:

答案 0 :(得分:1)

根据要求,我会将我的评论转到答案:

我建议为每个项目创建一个:owner_id字段,然后在has_and_belongs_to_manyUser模型之间创建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