【发布时间】:2010-12-14 18:31:12
【问题描述】:
我正在开发一个 Ruby on Rails 3 应用程序,这是我第一次使用 MongoDB。
我一直在思考这个问题几天,但我没有找到一个好的解决方案。我想讨论两个问题。
- 模型
- 如何将其与 Devise 集成
该应用程序是学校课程经理。它管理着许多学校,其中包含许多学生、课程、教授和任务。
一所学校的结构——有很多——是:
-
学校
- 导演
- 学生
- 教授
- 课程
- 任务
主任是学校的管理员。他是唯一可以创建教授、学生和课程的人。
- 只有 1 个主管。
- 可以有(0 - 多)门课程。
- 可以有(0 – 许多)学生
- 可以有(0 - 多)位教授
- 学生可能参加(0 – 许多)课程。
- 教授可能在(0 - 许多)课程中。
- 对于每门课程,可以有 (0-many) 个任务与 (0-many) 学生相关联。是的,教授可以向特定学生发送特定任务。
我花了几天时间研究如何使用 Mongoid 在 MongoDB 上构建这个模型集合,我找到了一个可能的解决方案。然而我来自关系数据库世界,也许这是一个糟糕的解决方案,我正在滥用“嵌入”:)
- 收藏学校
- 学校 1
- 嵌入 Director
- 嵌入用户
- 嵌入课程
- 嵌入任务
- 学校 2
- 嵌入 Director
- 嵌入用户
- 嵌入课程
- 嵌入任务
- 学校 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'
资源:学校做
资源 :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