Ruby on rails 与Mongoid的集成设计

Ruby on rails 与Mongoid的集成设计,ruby-on-rails,mongodb,devise,mongoid,Ruby On Rails,Mongodb,Devise,Mongoid,我正在开发一个RubyonRails3应用程序,这是我第一次使用MongoDB 我已经思考了几天这个问题,但我没有找到一个好的解决办法。我想讨论两个问题 模型 如何将此与设计相结合 申请者是学校课程经理。它管理着许多学校,包括许多学生、课程、教授和任务 一所学校——有很多——的结构是: 学校 导演 学生 教授 课程 任务 主任是学校的行政人员。他是唯一能够创造教授、学生和课程的人 正好有一个导演 可以有(0–多个)课程 可能有(0–多)个学生 可能有(0–多)位教授 学生可能参加(0–多个

我正在开发一个RubyonRails3应用程序,这是我第一次使用MongoDB

我已经思考了几天这个问题,但我没有找到一个好的解决办法。我想讨论两个问题

  • 模型
  • 如何将此与设计相结合
  • 申请者是学校课程经理。它管理着许多学校,包括许多学生、课程、教授和任务

    一所学校——有很多——的结构是:

    • 学校

      • 导演
      • 学生
      • 教授
      • 课程
      • 任务
    • 主任是学校的行政人员。他是唯一能够创造教授、学生和课程的人

    • 正好有一个导演
    • 可以有(0–多个)课程
    • 可能有(0–多)个学生
    • 可能有(0–多)位教授
    • 学生可能参加(0–多个)课程
    • 教授可能参加(0–多个)课程
    • 对于每门课程,可能有(0–多)项任务与(0–多)名学生相关。是的,教授可以向特定的学生发送特定的任务
    我花了几天时间思考如何使用Mongoid在MongoDB上构建这个模型集合,并找到了一个可能的解决方案。然而,我来自一个关系数据库世界,也许这是一个糟糕的解决方案,我滥用了“嵌入”:

    • 收藏学校
      • 第一学校
        • 嵌入控制器
        • 嵌入用户
        • 嵌入课程
        • 嵌入任务
      • 学校2
        • 嵌入控制器
        • 嵌入用户
        • 嵌入课程
        • 嵌入任务
    型号:

    class User
       include Mongoid::Document
    
       field :first_name
       field :last_name
       field :email
    
       embedded_in :school, :inverse_of => :director
       embedded_in :school, :inverse_of => :students
       embedded_in :school, :inverse_of => :professors
    end                                                 
    
    
    class School
       include Mongoid::Document          
    
       field :name
       key :name 
    
       embeds_one :director, :class_name => "User"
       embeds_many :students, :class_name => "User"
       embeds_many :professors, :class_name => "User"
    
       validates :name, :presence => true  
    end
    
    
    class Task
       include Mongoid::Document
    
       field :name
    
       references_one :student, :class => "User"
       references_one :course
    end
    
    另外,我想我将使用此类包装集合a任务。教授创建任务集合并分配给学生

     class TaskCollection
    
         include Mongoid::Document
    
         field :name
    
         references_many :students, :stored_as => array, :class => "User"
         references_one :task
    
     end
    
    这是我的第一个问题。我需要反馈。使用面向文档的数据库是否正确?演出改进?错误

    第二个问题。我们如何将此集成到Desive中

    我的第一次尝试是:

    Routes.rb

    为:用户设计,路径=>'schools/:school\u id/users'

    资源:学校有 资源:文档,:only=>[:索引] 资源:任务,:仅=>[:索引]
    结束

    但当我尝试注册用户时,我得到了一个错误

    http://localhost:3000/schools/pablo-de-olavide/users
    
     Mongoid::Errors::InvalidCollection in Devise/registrationsController#create
    
     Access to the collection for User is not allowed since it is an embedded document, please access a collection from the root document.
    

    非常感谢你的帮助

    我自己刚开始玩Desive和Mongoid

    您当前的需要是将用户设置为根文档(即,不嵌入),这就是Desive希望与用户模型交互的方式。我不知道它是否可以很容易地被覆盖,以实现您想要的。就我个人而言,即使你能做到,我也不认为这有什么意义

    至于您的文档设计问题,您应该从Mongdb了解一下


    从你的例子中,我认为用户对象是一个“第一类”对象,它可以保证它自己的集合。

    < P>这里是从设计wiki与将用户嵌入到另一个模型的信息:

    的链接。

    Desive github项目页面中有一个wiki页面,介绍了如何使用嵌入文档和Desive。但我没那么幸运。我将按照您的建议,在根级别创建一个用户集合。然后将学生和教授植入学校。学生和教授都有用户的参考资料。用户拥有一所学校的参考资料。我认为这是最好的性能明智的方法。