2010-12-14 18 views
6

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.

  1. El modelo
  2. 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

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.

Respuesta

3

Acabo de empezar a jugar con Devise and Mongoid.

Su necesidad inmediata es hacer que el usuario sea un documento raíz (es decir, no incrustado) así es como Devise espera interactuar con el modelo de usuario. No sé si puede anularse fácilmente para hacer lo que usted desea. Personalmente, no creo que tenga mucho sentido, incluso si pudieras.

cuanto a su pregunta de diseño documento que debería echar un vistazo a esto desde Mongdb http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-Embedvs.Reference

de su ejemplo que yo considero el objeto del usuario a ser un objeto "de primera clase", lo cual justificaría su propia colección.

+0

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