【问题标题】:Referenced 1-N and referenced N-N in Mongoid在 Mongoid 中引用 1-N 和引用 N-N
【发布时间】:2014-02-12 02:14:36
【问题描述】:

我正在尝试使用 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 关系而不是我拥有的 Array hack 中的 ObjectID。

【问题讨论】:

  • 那么当您尝试对合作者进行 HABTM 时发生了什么?顺便说一句,您的 collaborators 方法可能只是 User.find(collaborator_ids),不需要所有单独的 find 调用或手动数组争吵。
  • 为什么不为每个项目创建一个:owner_id 字段并在UserProject 模型之间建立has_and_belongs_to_many 关系。然后可以创建一些简单的函数来确定项目的所有者是谁,合作者是谁等
  • @muistooshort 他们之间存在冲突,因为他们都是User。很酷,不知道我能做到这一点。
  • @alalani 这是个好主意——我可能最终会这样做。
  • @alalani 你可以把评论变成答案。

标签: mongodb mongoid data-modeling


【解决方案1】:

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

我建议为每个项目创建一个:owner_id 字段,然后在UserProject 模型之间创建has_and_belongs_to_many 关系。然后创建一些简单的函数来确定项目的所有者是谁,合作者是谁等

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多