Estoy desarrollando una aplicación Ruby on Rails 3 y esta es la primera vez que uso MongoDB.Dispositivo de integración con Mongoid
He estado pensando por un par de días sobre este problema, y no encuentro una buena solución. Hay dos problemas que quiero discutir.
- El modelo
- Cómo integrar esto con Idear
La aplicación es un gestor de Cursos de la Escuela. Administra muchas escuelas, que contiene muchos estudiantes, cursos, profesores y tareas.
La estructura de una escuela - hay un muchos- es:
Escuela
- director
- estudiantes
- Profesores
- Cursos
- Tareas
El Director es el administrador de la escuela. Él es el único que puede crear profesores, estudiantes y cursos.
- Hay exactamente 1 Director.
- Puede haber (0 - muchos) cursos.
- No puede haber (0 - muchos estudiantes)
- No puede ser (0 - muchos profesores)
- Los estudiantes pueden estar en (0 - muchos cursos).
- Los profesores pueden estar en (0 - muchos) cursos.
- Para cada curso, puede haber (0-muchas) tareas asociadas con (0 - muchos) estudiantes. Sí, el profesor puede enviar tareas específicas a estudiantes específicos.
Pensé por un par de días en cómo arquitectura esta colección de modelos en MongoDB usando Mongoid, y llegué a una posible solución.Sin embargo, yo vengo de un mundo base de datos relacional y tal vez esto es una solución horrible y estoy abusando de 'integrar' :)
- Escuelas Collection
- Colegio 1
- incrustar director
- incrustar Usuarios
- Cursos incrustar
- Tareas incrustar
- escuela 2
- incrustar director
- incrustar Usuarios
- Cursos incrustar
- embed Tarea
- Colegio 1
Modelos:
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
Además, creo que usaré esta clase de tareas de una colección. Un profesor crea una TaskCollection y asigna estudiantes a ella.
class TaskCollection
include Mongoid::Document
field :name
references_many :students, :stored_as => array, :class => "User"
references_one :task
end
Así que esta es mi primera pregunta. Necesito comentarios. ¿Es la forma correcta de usar una base de datos orientada a documentos? ¿Actuación? Mejoras? ¿Errores?
Y la segunda pregunta. ¿Cómo podemos integrar esto en Devise?
Mi primer intento es la siguiente:
routes.rb
devise_for: usuarios,: path => 'escuelas/school_id:/usuarios'
recursos: Las escuelas recursos: documentos, : only => [: índice] recursos: tareas,: only => [: índice]
final
Pero cuando lo intento a registrar y el usuario me da un error.
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.
Muchas gracias por su ayuda.
Hay una página wiki en la página del proyecto Diseñar github que hablar un poco acerca de cómo utilizar los documentos incrustar y diseñar Pero no tengo suerte con eso. Voy a seguir tu sugerencia y crear una colección de usuarios en el nivel raíz. Y luego incrustar Estudiante y Profesor en la Escuela. Tanto el estudiante como el profesor tienen un Reference_one para un usuario. El usuario tiene una escuela Reference_one. Creo que es el mejor enfoque de rendimiento. – Nerian