2015-05-25 2 views
0

как мое первым приложение Rails, я строй приложения управления домашнего задания, которое имеет следующие таблицы:может ли PORO получить доступ к базе данных?

  • пользователей (от аутентификации DEViSE)
  • школы
  • курсы
  • Назначения

В отличие от большинства примеров курсов/оценок приложений, которые я нашел, это никогда не касается всех оценок для всех студентов для определенного курса, но имеет только соотношение 1: много b между студентами и курсами. Поэтому примеры на самом деле не помогают мне.

Чтобы рассчитать текущий класс пользователя в любом данном курсе (который требует доступа к данным как в модели курса, так и в модели назначения), я следую предложению отсюда о переполнении стека и создании PORO в приложении/моделях каталог под названием GradeCalculator.

Но это мой первый опыт создания PORO в приложении Rails, и большая часть документации, которую я нахожу в Интернете, предназначена для более сложных пользователей. Я предполагаю, что он не нужен контроллер (пожалуйста, поправьте меня, если я ошибаюсь), и я вижу, что строить его так же просто, как:

приложения/модель/gradecalculator.rb

Class GradeCalculator 

    def calculate_current_course_grade(course_id) 
    @graded_course_assignments = Assignment.where(user_id: current_user.id, course_id: course_id, graded: true) 
    #grab weights for each type of assignment in @graded_course_assignments from courses table 
    #do some calculations 
    #return the array 
    end 

    def calculate_user_GPA(current_user.id) 
    #more of the same 
    end 

end 

Мои вопросы:

  1. Может PORO доступ к базе данных (для получения данных из курсов и заданий таблиц). Или мне нужно передать все соответствующие данные из моих других классов (например, присваивания) в качестве параметров при вызове?

    1a. Если простой класс может получить доступ к базе данных, отличается ли синтаксис от синтаксиса в моделях? Может ли вышеуказанный код получить доступ к Assignment.where?

    1b. Как я могу назвать это ПОРО? Например, как я могу назвать это из своих представлений/присваиваний/index.html.erb?

  2. Может ли он получить доступ к помощнику current_user от Devise?

  3. Тангенциально, я только что понял, что я мог хранения весов назначения в таблице ассигнований. Я думал хронологически (пользователь вводит количество заданий домашней работы, викторины и т. Д. Во время ввода нового курса, который определяет вес для каждого типа назначения), но я мог программно иметь каждое новое задание, заполняющее собственное поле веса, ссылаясь на количество подобных назначений из родительского курса. Это означало бы, что логично, я мог бы выполнить оценку класса прямо в модели Assignment. Но если к курсу были добавлены дополнительные кредиты или другие изменения, все задания могут затем пересчитать их веса. Какой путь правильнее?

Написание этих вопросов заставляет меня подозревать, что я просто передать мой PORO соответствующих данных из моей точки зрения, пусть это делают расчеты по этим данным и возвращает класс. Но я все равно отправлю, на случай, если я ошибаюсь.

ответ

2

Причина для выведения бизнес-логики в PORO, как это, как правило, делает ваш код более легким для рассуждений и проще (и быстрее) для тестирования.С этой целью вы не хотите, чтобы GradeCalculator знал или заботился о том, как работает Assignment. Вы должны просто передать GradeCalculator все необходимые ему данные (или Relation, которые могут быть перепутаны как Enumerable). При вызове GradeCalculator Assignment.where означает, что ваши тесты будут зависеть от ActiveRecord и базы данных, что означает, что они будут медленными. Если GradeCalculator просто ожидает массив, в ваших тестах вам просто придется издеваться над массивом объектов, которые отвечают на любые атрибуты, которые должен знать GradeCalculator, и вы сможете запускать их без загрузки Rails вообще. (Это общепринятая иметь отдельную spec_helper.rb и rails_helper.rb так, чтобы данные, которые не нуждаются в Rails может работать без загрузки Rails, что делает их так намного быстрее.)

За ваш второй вопрос мой совет похож: Отделить ваш POROs как можно больше от Rails и от Devise.

+0

Спасибо! Вы подтвердили мои подозрения и выяснили причину их. –

Смежные вопросы