Интеграция Devise с Mongoid - PullRequest
       3

Интеграция Devise с Mongoid

6 голосов
/ 14 декабря 2010

Я занимаюсь разработкой приложения на Ruby on Rails 3, и впервые использую MongoDB.

Пару дней я размышлял над этой проблемой и не могу найти хорошего решения. Есть две проблемы, которые я хочу обсудить.

  1. Модель
  2. Как интегрировать это с Devise

Приложение - менеджер школьных курсов. Он управляет многими школами, в которых много учеников, курсов, профессоров и задач.

Структура одной школы - там много - это:

  • Школа

    • директор
    • Студенты
    • Профессора
    • Курсы
    • Задачи
  • Директор является администратором школы. Он единственный, кто может создавать профессоров, студентов и курсов.

  • Существует ровно 1 директор.
  • Может быть (0 - много) курсов.
  • Может быть (0 - много) студентов
  • Может быть (0 - много) профессоров
  • Студенты могут посещать (0 - много) курсов.
  • Профессора могут быть на (0 - много) курсах.
  • Для каждого курса может быть (0 – много) заданий, связанных с (0 - многими) студентами. Да, профессор может отправлять конкретные задания конкретным студентам.

Я подумал пару дней о том, как создать архитектуру этой коллекции моделей на MongoDB с использованием Mongoid, и я нашел возможное решение. Все же я из мира реляционных баз данных, и, возможно, это ужасное решение, и я злоупотребляю «embed»:)

  • Коллекционные школы
    • Школа 1
      • Вставить директора
      • Вставить пользователей
      • Embed Courses
      • Вставить задачи
    • Школа 2
      • Вставить директора
      • Вставить пользователей
      • Embed Courses
      • Вставить задачу

Модель:

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.

Большое спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2010

Я только начал играть с Devise и Mongoid сам.

Ваша неотложная задача - сделать пользователя корневым документом (т. Е. Не внедренным), именно так Devise ожидает взаимодействия с моделью пользователя. Я не знаю, может ли это быть легко отменено, чтобы делать то, что вы хотите. Лично я не думаю, что это имело бы смысл, даже если бы ты мог.

Что касается вашего вопроса о дизайне документов, вы должны взглянуть на это из Mongdb http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-Embedvs.Reference

Из вашего примера я бы посчитал объект User объектом "первого класса", который гарантировал бы его собственную коллекцию.

1 голос
/ 23 августа 2012

Вот ссылка из вики Devise с информацией о встраивании пользователей в другую модель:

Как: -Embed-users-in-your-account-model-with-Mongoid

...