parent
e969c49903
commit
9f98ff8eed
@ -0,0 +1,147 @@
|
||||
require 'yaml'
|
||||
require 'date'
|
||||
require_relative 'student'
|
||||
require_relative 'student_short'
|
||||
require_relative 'data_list_student_short'
|
||||
require_relative 'data_table'
|
||||
|
||||
class Students_list_YAML
|
||||
attr_reader :students
|
||||
|
||||
def initialize(filename)
|
||||
@filename = filename
|
||||
@students = []
|
||||
end
|
||||
|
||||
# Чтение всех значений из YAML-файла.
|
||||
# Файл должен содержать массив хэшей, каждый из которых представляет студента.
|
||||
def load_from_file
|
||||
if File.exist?(@filename)
|
||||
begin
|
||||
data = YAML.load_file(@filename)
|
||||
@students = data.map { |student_hash| hash_to_student(student_hash) }
|
||||
rescue StandardError => e
|
||||
warn "Ошибка при загрузке YAML: #{e.message}"
|
||||
@students = []
|
||||
end
|
||||
else
|
||||
@students = []
|
||||
end
|
||||
self
|
||||
end
|
||||
|
||||
# Запись всех значений в YAML-файл.
|
||||
# Каждый объект Student преобразуется в хэш.
|
||||
def save_to_file
|
||||
data = @students.map { |student| student_to_hash(student) }
|
||||
File.open(@filename, 'w') do |file|
|
||||
file.write(data.to_yaml)
|
||||
end
|
||||
self
|
||||
rescue IOError => e
|
||||
warn "Ошибка при записи в YAML: #{e.message}"
|
||||
self
|
||||
end
|
||||
|
||||
# Получить объект Student по ID.
|
||||
def get_student_by_id(id)
|
||||
@students.find { |s| s.id.to_s == id.to_s }
|
||||
end
|
||||
|
||||
# Получить список из k студентов (страница n) в виде объекта DataList.
|
||||
# Сначала список сортируется по ФамилияИнициалы, затем выбирается нужный срез.
|
||||
# Результат преобразуется в объекты StudentShort.
|
||||
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 }
|
||||
selected_students = sorted_students[start_index, k] || []
|
||||
short_objects = selected_students.map { |s| StudentShort.from_student(s) }
|
||||
|
||||
if data_list && data_list.is_a?(DataList)
|
||||
if data_list.respond_to?(:items=)
|
||||
data_list.items = short_objects
|
||||
else
|
||||
data_list = DataListStudentShort.new(short_objects)
|
||||
end
|
||||
data_list
|
||||
else
|
||||
DataListStudentShort.new(short_objects)
|
||||
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
|
||||
else
|
||||
max_id = @students.map { |s| s.id.to_i }.max
|
||||
max_id + 1
|
||||
end
|
||||
student.id = new_id.to_s
|
||||
@students << student
|
||||
student
|
||||
end
|
||||
|
||||
# Заменить элемент списка по ID.
|
||||
# Если элемент найден, новый объект получает тот же ID.
|
||||
def update_student_by_id(id, new_student)
|
||||
index = @students.find_index { |s| s.id.to_s == id.to_s }
|
||||
if index
|
||||
new_student.id = @students[index].id
|
||||
@students[index] = new_student
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
# Удалить элемент списка по ID.
|
||||
# Возвращает true, если удаление прошло успешно.
|
||||
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
|
||||
|
||||
private
|
||||
|
||||
# Преобразование объекта Student в хэш для записи в YAML.
|
||||
def student_to_hash(student)
|
||||
{
|
||||
'id' => student.id,
|
||||
'git' => student.git,
|
||||
'surname' => student.surname,
|
||||
'name' => student.name,
|
||||
'patronymic' => student.patronymic,
|
||||
'birth_date' => student.birth_date.to_s,
|
||||
'phone' => student.phone,
|
||||
'telegram' => student.telegram,
|
||||
'email' => student.email
|
||||
}
|
||||
end
|
||||
|
||||
# Преобразование хэша в объект Student.
|
||||
def hash_to_student(hash)
|
||||
Student.new(
|
||||
id: hash['id'],
|
||||
git: hash['git'],
|
||||
surname: hash['surname'],
|
||||
name: hash['name'],
|
||||
patronymic: hash['patronymic'],
|
||||
birth_date: Date.parse(hash['birth_date']),
|
||||
phone: hash['phone'],
|
||||
telegram: hash['telegram'],
|
||||
email: hash['email']
|
||||
)
|
||||
end
|
||||
end
|
Loading…
Reference in new issue