将Devise与Mongoid集成

Ner*_*ian 6 ruby-on-rails mongodb devise mongoid

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

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

  1. 该模型
  2. 如何将其与Devise集成

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

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

  • 学校

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

  • 正好有一位导演.
  • 可以有(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
Run Code Online (Sandbox Code Playgroud)

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

 class TaskCollection

     include Mongoid::Document

     field :name

     references_many :students, :stored_as => array, :class => "User"
     references_one :task

 end
Run Code Online (Sandbox Code Playgroud)

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

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

我的第一次尝试是这样的:

的routes.rb

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

资源:学校做资源:文件,:只有=> [:index]资源:任务,:只有=> [:index]
结束

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

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.
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助.

Mic*_*uso 3

我自己刚刚开始玩 Devise 和 Mongoid。

您的迫切需要是使 User 成为根文档(即不嵌入),这就是 Devise 期望与 User 模型交互的方式。我不知道是否可以轻松地覆盖它来执行您想要的操作。就我个人而言,即使可以,我也不认为这有多大意义。

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

从您的示例中,我认为 User 对象是一个“First Class”对象,它将保证其自己的集合。