|
|
require_relative 'data_list_student_short'
|
|
|
|
|
|
class Students_list_txt
|
|
|
attr_reader :students
|
|
|
|
|
|
def initialize(filename)
|
|
|
@filename = filename
|
|
|
@students = []
|
|
|
end
|
|
|
|
|
|
# Чтение всех значений из файла.
|
|
|
# Предполагается, что каждая строка файла соответствует формату,
|
|
|
# который понимает метод Student.from_string.
|
|
|
def load_from_file
|
|
|
if File.exist?(@filename)
|
|
|
File.open(@filename, 'r') do |file|
|
|
|
@students = file.each_line.map do |line|
|
|
|
line = line.strip
|
|
|
next if line.empty?
|
|
|
begin
|
|
|
Student.from_string(line)
|
|
|
rescue ArgumentError => e
|
|
|
warn "Ошибка при парсинге строки: #{line}. #{e.message}"
|
|
|
nil
|
|
|
end
|
|
|
end.compact
|
|
|
end
|
|
|
else
|
|
|
@students = []
|
|
|
end
|
|
|
self
|
|
|
end
|
|
|
|
|
|
# Запись всех значений в файл.
|
|
|
# Для записи используется формат, возвращаемый методом to_s у объекта Student.
|
|
|
def save_to_file
|
|
|
File.open(@filename, 'w') do |file|
|
|
|
@students.each do |student|
|
|
|
file.puts student.to_s
|
|
|
end
|
|
|
end
|
|
|
self
|
|
|
end
|
|
|
|
|
|
# Получить объект класса Student по ID.
|
|
|
def get_student_by_id(id)
|
|
|
@students.find { |s| s.id.to_s == id.to_s }
|
|
|
end
|
|
|
|
|
|
# Получить список из k элементов, начиная с (n-1)*k-й записи, в виде объекта DataList.
|
|
|
# Если передан существующий объект data_list, то его список обновляется.
|
|
|
# При выборке сначала выполняется сортировка по фамилии и инициалам.
|
|
|
#
|
|
|
# Пример: k = 20, n = 2 даст вторую «страницу» из 20 элементов.
|
|
|
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] || []
|
|
|
# Преобразуем объекты Student в StudentShort
|
|
|
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).
|
|
|
# Новый ID вычисляется как (максимальный существующий id + 1) или 1, если список пуст.
|
|
|
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
|
|
|
end
|