diff --git a/lab2/README.md b/lab2/README.md index fd9c642..96084d0 100644 --- a/lab2/README.md +++ b/lab2/README.md @@ -149,6 +149,7 @@ classDiagram BinarySearchTree o-- Node Node o-- Student + StudentsList o-- Student StudentsListBase o-- Student StudentsListDB o-- DatabaseConnection DatabaseConnection <.. Singleton diff --git a/lab2/providers/students_list.rb b/lab2/providers/students_list.rb index 9822db1..e190c1d 100644 --- a/lab2/providers/students_list.rb +++ b/lab2/providers/students_list.rb @@ -12,24 +12,23 @@ class StudentsList @students = [] end - # Загрузка студентов через выбранную стратегию. + # Загрузка студентов через выбранную стратегию def load @students = @persistence_strategy.load(@filename) self end - # Сохранение студентов через выбранную стратегию. + # Сохранение студентов через выбранную стратегию def save @persistence_strategy.save(@filename, @students) self end - # Получить объект Student по ID. def get_student_by_id(id) @students.find { |s| s.id.to_s == id.to_s } end - # Получить список из k студентов (страница n) в виде объекта DataList. + # Получить список из k студентов (страница n) в виде объекта DataList def get_k_n_student_short_list(k, n, data_list = nil) start_index = (n - 1) * k sorted_students = @students.sort_by { |s| s.surname_initials } @@ -48,12 +47,11 @@ class StudentsList end end - # Сортировка студентов по фамилии и инициалам. + # Сортировка студентов по фамилии и инициалам def sort_students! @students.sort_by! { |s| s.surname_initials } end - # Добавление студента с автоматическим присвоением нового ID. def add_student(student) new_id = if @students.empty? 1 @@ -66,7 +64,6 @@ class StudentsList student end - # Обновление студента по ID. def update_student_by_id(id, new_student) index = @students.find_index { |s| s.id.to_s == id.to_s } if index @@ -78,14 +75,12 @@ class StudentsList end end - # Удаление студента по ID. def delete_student_by_id(id) initial_count = @students.size @students.reject! { |s| s.id.to_s == id.to_s } initial_count != @students.size end - # Получить количество студентов. def get_student_short_count @students.size end diff --git a/lab2/providers/students_list_base.rb b/lab2/providers/students_list_base.rb index d26ed13..ad9aa82 100644 --- a/lab2/providers/students_list_base.rb +++ b/lab2/providers/students_list_base.rb @@ -11,22 +11,21 @@ class StudentsListBase @students = [] end - # Абстрактный метод для загрузки данных. + # Абстрактный метод def load_from_file raise NotImplementedError, "Метод load_from_file должен быть реализован в подклассе" end - # Абстрактный метод для сохранения данных. + # Абстрактный метод def save_to_file raise NotImplementedError, "Метод save_to_file должен быть реализован в подклассе" end - # Получить объект Student по ID. def get_student_by_id(id) @students.find { |s| s.id.to_s == id.to_s } end - # Получить список из k студентов (страница n) в виде объекта DataList. + # Получить список из k студентов (страница n) в виде объекта DataList def get_k_n_student_short_list(k, n, data_list = nil) start_index = (n - 1) * k sorted_students = @students.sort_by { |s| s.surname_initials } @@ -45,12 +44,11 @@ class StudentsListBase end end - # Сортировать список студентов по ФамилияИнициалы. + # Сортировать список студентов по ФамилияИнициалы def sort_students! @students.sort_by! { |s| s.surname_initials } end - # Добавить объект Student в список (формирование нового ID). def add_student(student) new_id = if @students.empty? 1 @@ -63,7 +61,6 @@ class StudentsListBase student end - # Обновить студента по ID. def update_student_by_id(id, new_student) index = @students.find_index { |s| s.id.to_s == id.to_s } if index @@ -75,14 +72,12 @@ class StudentsListBase end end - # Удалить студента по ID. def delete_student_by_id(id) initial_count = @students.size @students.reject! { |s| s.id.to_s == id.to_s } initial_count != @students.size end - # Получить количество студентов. def get_student_short_count @students.size end diff --git a/lab2/providers/students_list_db.rb b/lab2/providers/students_list_db.rb index 59e653b..9b893ef 100644 --- a/lab2/providers/students_list_db.rb +++ b/lab2/providers/students_list_db.rb @@ -9,14 +9,12 @@ class StudentsListDB @db = DatabaseConnection.instance end - # Получить объект Student по ID. def get_student_by_id(id) result = @db.query("SELECT * FROM student WHERE id = #{id} LIMIT 1") row = result.first row ? row_to_student(row) : nil end - # Получить список из k студентов (страница n) в виде объекта DataList. def get_k_n_student_short_list(k, n) offset = (n - 1) * k results = @db.query("SELECT * FROM student ORDER BY surname, name, patronymic LIMIT #{k} OFFSET #{offset}") @@ -24,7 +22,6 @@ class StudentsListDB DataListStudentShort.new(student_shorts) end - # Добавить объект Student в БД (ID формируется автоматически). def add_student(student) sql = <<~SQL INSERT INTO student (git, surname, name, patronymic, birth_date, phone, telegram, email) @@ -46,7 +43,6 @@ class StudentsListDB student end - # Обновить студента по ID. def update_student_by_id(id, new_student) sql = <<~SQL UPDATE student SET @@ -65,13 +61,11 @@ class StudentsListDB @db.client.affected_rows > 0 end - # Удалить студента по ID. def delete_student_by_id(id) @db.query("DELETE FROM student WHERE id = #{id}") @db.client.affected_rows > 0 end - # Получить количество студентов. def get_student_short_count result = @db.query("SELECT COUNT(*) as count FROM student") result.first['count'] @@ -79,7 +73,8 @@ class StudentsListDB private - # Преобразование строки результата в объект Student. + # Преобразование строки результата в объект Student + def row_to_student(row) Student.new( id: row['id'].to_s, @@ -94,7 +89,7 @@ class StudentsListDB ) end - # Простой метод для экранирования строк (на практике лучше использовать подготовленные выражения). + # Метод для экранирования строк def escape(value) @db.client.escape(value.to_s) end diff --git a/lab2/tests/test_select_db.rb b/lab2/tests/test_select_db.rb index 6e80ea6..9c1f5a3 100644 --- a/lab2/tests/test_select_db.rb +++ b/lab2/tests/test_select_db.rb @@ -3,11 +3,11 @@ require_relative '../providers/students_list_db' students_db = StudentsListDB.new -# Пример: получение студента с ID = 1 +# получение студента с ID = 1 student = students_db.get_student_by_id(1) puts student ? student.get_info : "Студент не найден" -# Пример: получение второй страницы по 2 записи (если записей достаточно) +# получение второй страницы по 2 записи (если записей достаточно) data_list = students_db.get_k_n_student_short_list(2, 2) puts "Количество студентов: #{students_db.get_student_short_count}" data_table = data_list.get_data