Я не разбираюсь в ассоциациях Ruby, но мне кажется, что модель данных каким-то образом сочетается с логикой времени выполнения.
Если бы я создал модель данных для вопросов и тестов, я бы хотел повторно использовать мои вопросы в тестах, а также повторно использовать подготовленные тесты (наборы вопросов) в лекциях. В этом случае я бы написал что-то вроде
class Lecture
has_and_belongs_to_many :tests
end
class Test
has_and_belongs_to_many :lectures
has_and_belongs_to_many :questions
end
class Question
has_and_belongs_to_many :tests
end
Отдельно от этой структуры у меня была бы некоторая структура, соответствующая лекциям, тестам, вопросам и представлению результатов в реальном времени. Результатом является попытка ответить на вопрос в реальном времени данного студента.
Я бы также «делегировал» проверку состояния лекционного сеанса тестовому. Если тестовый сеанс не может быть запущен по какой-либо причине, вопросный сеанс также не может быть запущен.
Чтобы выполнить модульное тестирование сеанса вопросов, вам нужно будет только смоделировать тестовый сеанс, для модульного тестирования тестового сеанса вам потребуется макет лекционного сеанса и т. Д.
class Lecture_Session
has_many :tests_sessions
belongs_to :lecture
end
class Test_Session
belongs_to :lecture_session
belongs_to :test
has_many :question_sessions
def validate
raise "Lecture not started!" unless lecture_session.started?
end
end
class Question_Session
belongs_to :question
belongs_to :test_session
def validate
raise "Test not started!" unless test_session.started?
end
end
class Result
belongs_to :lecture_session
belongs_to :test_session
belongs_to :question_session
belongs_to :student
def validate
raise "Question is not active!" unless question_session.active?
end
end
Надеюсь, это поможет.