MongoMapper:我如何创建这样的模型

时间:2011-11-28 00:20:28

标签: ruby mongodb logic mongomapper database

假设我们有两个模型,Task和User。 因此,用户可以拥有许多任务,任务也应该能够拥有许多用户。但是,任务还应该有一个独特的创建者,他也是一个用户。

例:

此上下文中的任务是这样的: 任务ID,任务创建者,应该执行任务的用户

User_1创建一个任务,然后他就是创建者。 User_1将User_2和User_3指定为应该执行任务的用户。所以这两个最后的用户不是任务的创建者。

如何创建此模型,以便如果我有一个任务对象,我可以找到它的创建者和应该完成它的用户。如果我有一个用户,我该如何找到他创建的所有任务以及他应该完成的所有任务。

2 个答案:

答案 0 :(得分:2)

您需要在任务和用户之间建立多对多关系,并且您需要在用户和任务之间建立额外的一对多关系,并指向创建者(用户)。

这些方面的内容:(我通常使用Mongoid,所以仔细检查MongoMapper API中关系的语法 - 下面的链接..你可以手动指定:foreign_key和:class)

这个想法是你在模型之间有两种关系,一种模拟多对多关系 您可以使用assigned_usersassigned_tasks以及与任务的creatorcreated_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

另见: