ruby-on-rails - 将设计与 Mongoid 集成

标签 ruby-on-rails mongodb devise mongoid

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

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

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

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

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

  • 学校

    • 导演
    • 学生
    • 教授
    • 类(class)
    • 任务
  • 校长是学校的管理员。他是唯一可以创建教授、学生和类(class)的人。

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

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

  • 收藏学校
    • 学校 1
      • 嵌入 Director
      • 嵌入用户
      • 嵌入类(class)
      • 嵌入任务
    • 学校 2
      • 嵌入 Director
      • 嵌入用户
      • 嵌入类(class)
      • 嵌入任务

型号:

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.

非常感谢您的帮助。

最佳答案

我自己刚开始玩 Devise 和 Mongoid。

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

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

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

关于ruby-on-rails - 将设计与 Mongoid 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4442799/

相关文章:

ruby-on-rails - 如何使用 "github_api"gem 从 GitHub API v3 获得 100 多个结果?

ruby-on-rails - 在 rails 中处理 STI 子类路由的最佳实践

ruby-on-rails - 无法安装 linecache19 gem

mysql - Rails 4.1、Ruby 2.1、Devise,为什么我的 .where() 中有多个条件的 'syntax error, unexpected tConstant'?

ruby-on-rails - 如何使用 devise 和 Rails 4 设置用户身份验证?

ruby-on-rails - 将不可打印的字符保存到 Rails 中的数据库

mongodb - NotSerializableException org.neo4j.kernel.EmbeddedGraphDatabase

mongodb - 在 Mongo 中使用唯一键创建 sawMessages 对象

node.js - 保存后 Mongoose 填充

ruby-on-rails - Rails - 在 ActiveRecord 数据库查询中使用 current_user.id