You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kubsu-sm5-ruby/lab2/providers/students_list.rb

88 lines
2.3 KiB

require_relative '../student'
require_relative '../student_short'
require_relative '../data_list_student_short'
require_relative '../data_table'
class StudentsList
attr_reader :students
def initialize(filename, persistence_strategy)
@filename = filename
@persistence_strategy = persistence_strategy
@students = []
end
# Загрузка студентов через выбранную стратегию
def load
@students = @persistence_strategy.load(@filename)
self
end
# Сохранение студентов через выбранную стратегию
def save
@persistence_strategy.save(@filename, @students)
self
end
def get_student_by_id(id)
@students.find { |s| s.id.to_s == id.to_s }
end
# Получить список из 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 }
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
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
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
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