我正在开发Ruby on Rails 3应用程序,这是我第一次使用MongoDB。
我一直在考虑这个问题几天,我找不到一个好的解决方案。我想讨论两个问题。
该申请是学校课程经理。它管理着许多学校,其中包含许多学生,课程,教授和任务。
一所学校的结构 - 有很多 - :
学校
主任是学校的管理员。他是唯一一个可以创建教授,学生和课程的人。
关于如何使用Mongoid在MongoDB上构建这个模型集合,我有几天了,我找到了一个可能的解决方案。然而,我来自一个关系数据库世界,也许这是一个糟糕的解决方案,我滥用'嵌入':)
型号:
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'
资源:学校 资源:文件,:仅=> [:指数] 资源:任务,:仅=> [:指数]但是当我尝试注册和用户时,我收到错误。
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.
非常感谢你的帮助。
答案 0 :(得分:3)
我刚刚开始和Devise和Mongoid一起玩。
您的当前需求是使用户成为根文档(即未嵌入),这就是Devise期望与用户模型交互的方式。我不知道是否可以轻易地覆盖它来做你想要的。就个人而言,即使你可以,我也不认为它会有很多意义。
关于您的文档设计问题,您应该从Mongdb http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-Embedvs.Reference
看一下从你的例子中我会认为User对象是一个“First Class”对象,它可以保证自己的收集。
答案 1 :(得分:1)
以下是Devise wiki中有关将用户嵌入到另一个模型的信息的链接: