【发布时间】: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字段并在User和Project模型之间建立has_and_belongs_to_many关系。然后可以创建一些简单的函数来确定项目的所有者是谁,合作者是谁等 -
@muistooshort 他们之间存在冲突,因为他们都是
User。很酷,不知道我能做到这一点。 -
@alalani 这是个好主意——我可能最终会这样做。
-
@alalani 你可以把评论变成答案。
标签: mongodb mongoid data-modeling