我正在开发一个 Ruby on Rails 3 应用程序,这是我第一次使用 MongoDB。
我一直在思考这个问题几天,但我没有找到一个好的解决方案。我想讨论两个问题。
- 型号
- 如何将其与 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)
- 嵌入任务
- 学校 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.
非常感谢您的帮助。
最佳答案
我自己刚开始玩 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/