我正在开发一个Ruby on Rails 3应用程序,这是我第一次使用MongoDB。
我已经思考了几天这个问题,但是我没有找到一个好的解决方案。我想讨论两个问题。
- 模型
- 如何将其与Devise集成
该应用程序是一个学校课程管理器。它管理许多学校,其中包含许多学生、课程、教授和任务。
一个学校的结构 - 有很多个:
学校
- 主任
- 学生
- 教授
- 课程
- 任务
主任是学校的管理员。他是唯一可以创建教授、学生和课程的人。
- 确切地说,只有1个主任。
- 可以有(0-多个)课程。
- 可以有(0-多个)学生。
- 可以有(0-多个)教授。
- 学生可以参加(0-多个)课程。
- 教授可以参加(0-多个)课程。
- 对于每门课程,可能会有(0-多个)与(0-多个)学生相关联的任务。是的,教授可以向特定的学生发送特定的任务。
我思考了几天如何在MongoDB中使用Mongoid架构这些模型集合,并且我得出了一个可能的解决方案。但我来自关系数据库世界,也许这是一个可怕的解决方案,我正在滥用'嵌入' :)
- 集合学校
- 学校1
- 嵌入主任
- 嵌入用户
- 嵌入课程
- 嵌入任务
- 学校2
- 嵌入主任
- 嵌入用户
- 嵌入课程
- 嵌入任务
- 学校1
模型:
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.
非常感谢您的帮助。