【问题标题】:Integrating Devise with Mongoid将设计与 Mongoid 集成
【发布时间】:2010-12-14 18:31:12
【问题描述】:

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

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

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

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

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

  • 学校

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

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

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

  • 收藏学校
    • 学校 1
      • 嵌入 Director
      • 嵌入用户
      • 嵌入课程
      • 嵌入任务
    • 学校 2
      • 嵌入 Director
      • 嵌入用户
      • 嵌入课程
      • 嵌入任务

型号:

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'

资源:学校做 资源 :documents, :only => [:index] 资源 :tasks, :only => [: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.

非常感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails mongodb devise mongoid


    【解决方案1】:

    我自己刚开始玩 Devise 和 Mongoid。

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

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

    从您的示例中,我认为 User 对象是一个“第一类”对象,可以保证它自己的集合。

    【讨论】:

    • 在 Devise github 项目页面中有一个 wiki 页面,讲了一点如何使用嵌入文档和设计。但我不走运。我将按照您的建议在根级别创建一个用户集合。然后将学生和教授嵌入学校。学生和教授都有一个用户的 Reference_one。用户有一个 Reference_one 学校。我认为这是最好的性能明智的方法。
    【解决方案2】:

    这是来自 Devise wiki 的链接,其中包含有关将用户嵌入另一个模型的信息:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多