将Devise与Mongoid集成

时间:2010-12-14 18:31:13

标签: ruby-on-rails mongodb devise mongoid

我正在开发Ruby on Rails 3应用程序,这是我第一次使用MongoDB。

我一直在考虑这个问题几天,我找不到一个好的解决方案。我想讨论两个问题。

  1. 模特
  2. 如何将其与Devise
  3. 集成

    该申请是学校课程经理。它管理着许多学校,其中包含许多学生,课程,教授和任务。

    一所学校的结构 - 有很多 - :

    • 学校

      • 学生
      • 教授
      • 课程
      • 任务
    • 主任是学校的管理员。他是唯一一个可以创建教授,学生和课程的人。

    • 只有1位导演。
    • 可以有(0多个)课程。
    • 可以有(0-多名)学生
    • 可以有(0多名)教授
    • 学生可能参加(0 - 多)课程。
    • 教授可能在(0 - 多)课程中。
    • 对于每门课程,可以有(0多个)与(0-多)学生相关的任务。是的,教授可以向特定学生发送特定任务。

    关于如何使用Mongoid在MongoDB上构建这个模型集合,我有几天了,我找到了一个可能的解决方案。然而,我来自一个关系数据库世界,也许这是一个糟糕的解决方案,我滥用'嵌入':)

    • 收集学校
      • 学校1
        • 嵌入导演
        • 嵌入用户
        • 嵌入课程
        • 嵌入任务
      • 学校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
    

    另外,我想我会用这个类包装一个集合任务。教授创建一个TaskCollection并为学生分配。

     class TaskCollection
    
         include Mongoid::Document
    
         field :name
    
         references_many :students, :stored_as => array, :class => "User"
         references_one :task
    
     end
    

    所以这是我的第一个问题。我需要反馈。这是使用面向文档的数据库的正确方法吗?性能?改进?错误?

    第二个问题。我们如何在Devise中集成它?

    我的第一次尝试就是:

    Routes.rb

    devise_for:users,:path => 'schools /:school_id / users'

    资源:学校      资源:文件,:仅=> [:指数]      资源:任务,:仅=> [:指数]
      端

    但是当我尝试注册和用户时,我收到错误。

    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.
    

    非常感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

我刚刚开始和Devise和Mongoid一起玩。

您的当前需求是使用户成为根文档(即未嵌入),这就是Devise期望与用户模型交互的方式。我不知道是否可以轻易地覆盖它来做你想要的。就个人而言,即使你可以,我也不认为它会有很多意义。

关于您的文档设计问题,您应该从Mongdb http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-Embedvs.Reference

看一下

从你的例子中我会认为User对象是一个“First Class”对象,它可以保证自己的收集。

答案 1 :(得分:1)

以下是Devise wiki中有关将用户嵌入到另一个模型的信息的链接:

How-To:-Embed-users-in-your-account-model-with-Mongoid