假设我们有两个模型,Task和User。 因此,用户可以拥有许多任务,任务也应该能够拥有许多用户。但是,任务还应该有一个独特的创建者,他也是一个用户。
例:
此上下文中的任务是这样的: 任务ID,任务创建者,应该执行任务的用户
User_1创建一个任务,然后他就是创建者。 User_1将User_2和User_3指定为应该执行任务的用户。所以这两个最后的用户不是任务的创建者。
如何创建此模型,以便如果我有一个任务对象,我可以找到它的创建者和应该完成它的用户。如果我有一个用户,我该如何找到他创建的所有任务以及他应该完成的所有任务。
答案 0 :(得分:2)
您需要在任务和用户之间建立多对多关系,并且您需要在用户和任务之间建立额外的一对多关系,并指向创建者(用户)。
这些方面的内容:(我通常使用Mongoid,所以仔细检查MongoMapper API中关系的语法 - 下面的链接..你可以手动指定:foreign_key和:class)
这个想法是你在模型之间有两种关系,一种模拟多对多关系
您可以使用assigned_users
或assigned_tasks
以及与任务的creator
或created_tasks
进行一对多的关系对于给定的用户。如果您为关系选择了这些名称,那么将清楚哪个是。
class Task
include MongoMapper::Document
key :title, String , :required => true
key :user_ids , Array
has_many :users, :in => user_ids # , :as => :assigned_users
key :creator_id , ObjectId
belongs_to: user, :as => :creator
end
class User
include MongoMapper::Document
key: name, String, :required => true
has_many :tasks # , :as => :assigned_tasks
has_many :tasks, :as => :created_tasks
end
请参阅:
http://mongomapper.com/documentation/plugins/associations.html
答案 1 :(得分:2)
Tilo建议的答案对于如何建模数据是正确的,但示例代码不正确且不起作用。 :as
选项适用于polymorphic associations,您要使用:foreign_key
选项。此外,您不能有两个名为相同的关联。请参阅下面的修订代码。
class Task
include MongoMapper::Document
key :title, String , :required => true
key :assigned_user_ids, Array
has_many :assigned_users, :in => :assigned_user_ids
key :creator_id , ObjectId
belongs_to :creator, :class => User
# userstamps! also accomplishes the above
end
class User
include MongoMapper::Document
key: name, String, :required => true
has_many :created_tasks, :foreign_key => :creator_id, :class => Task
# inverse of many :in is still in the works
# see https://github.com/jnunemaker/mongomapper/pull/259
# this is a decent workaround for now
def assigned_tasks
Task.where(:assigned_user_ids => self.id)
end
end
另见: