【问题标题】:MongoMapper: how do I create a model like thisMongoMapper:我如何创建这样的模型
【发布时间】:2011-11-28 00:20:27
【问题描述】:

假设我们有两个模型,任务和用户。 所以一个用户可以有很多任务,任务也应该有很多用户。但是,一个任务也应该有一个唯一的创建者,他也是一个用户。

示例:

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

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

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

【问题讨论】:

标签: ruby mongodb logic mongomapper database


【解决方案1】:

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

类似这样的东西:(我通常使用 Mongoid,所以请仔细检查 MongoMapper API 中关系的语法 - 链接如下......您可以手动指定 :foreign_key 和 :class)

这个想法是模型之间有两种关系,一种是多对多关系的建模 您可以通过它获得assigned_usersassigned_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

【讨论】:

  • 是的,你必须指定:foreign_key:class
【解决方案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

另见:

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 2013-11-09
    • 2021-07-21
    • 2011-07-08
    • 1970-01-01
    • 2021-05-02
    • 2021-05-09
    • 2019-06-18
    相关资源
    最近更新 更多