将Devise与Mongoid集成

6

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

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

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

该应用程序是一个学校课程管理器。它管理许多学校,其中包含许多学生、课程、教授和任务。

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

  • 学校

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

  • 确切地说,只有1个主任。
  • 可以有(0-多个)课程。
  • 可以有(0-多个)学生。
  • 可以有(0-多个)教授。
  • 学生可以参加(0-多个)课程。
  • 教授可以参加(0-多个)课程。
  • 对于每门课程,可能会有(0-多个)与(0-多个)学生相关联的任务。是的,教授可以向特定的学生发送特定的任务。

我思考了几天如何在MongoDB中使用Mongoid架构这些模型集合,并且我得出了一个可能的解决方案。但我来自关系数据库世界,也许这是一个可怕的解决方案,我正在滥用'嵌入' :)

  • 集合学校
    • 学校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'
资源:学校 资源:文档,仅限于= > [: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.

非常感谢您的帮助。
2个回答

3
我刚开始使用Devise和Mongoid。
你现在的需求是将用户(User)作为一个根文档,而不是嵌入式文档。这是Devise期望与User模型交互的方式。我不确定它是否可以轻松覆盖以实现你想要的功能。就个人而言,即使你可以做到这一点,我认为也没有多大意义。
至于你的文档设计问题,你应该查看这个来自Mongdb的链接:http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-Embedvs.Reference 从你的示例中,我认为用户对象是一个“First Class”对象,值得拥有自己的集合。

在Devise的github项目页面中有一个维基页面,介绍了如何使用嵌入式文档和Devise。但是我没有成功。我将遵循您的建议,在根级别创建一个用户集合。然后在学校中嵌入学生和教授。学生和教授都有一个对用户的引用。用户有一个对学校的引用。我认为这是最好的性能方面的方法。 - Nerian

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接