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.
102 lines
3.4 KiB
102 lines
3.4 KiB
require_relative '../db_connection'
|
|
require_relative '../student'
|
|
require_relative '../student_short'
|
|
require_relative '../data_list_student_short'
|
|
require 'date'
|
|
|
|
class StudentsListDB
|
|
def initialize
|
|
@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}")
|
|
student_shorts = results.map { |row| StudentShort.from_student(row_to_student(row)) }
|
|
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)
|
|
VALUES (
|
|
'#{escape(student.git)}',
|
|
'#{escape(student.surname)}',
|
|
'#{escape(student.name)}',
|
|
'#{escape(student.patronymic)}',
|
|
'#{student.birth_date}',
|
|
#{student.phone ? "'#{escape(student.phone)}'" : "NULL"},
|
|
#{student.telegram ? "'#{escape(student.telegram)}'" : "NULL"},
|
|
#{student.email ? "'#{escape(student.email)}'" : "NULL"}
|
|
)
|
|
SQL
|
|
|
|
@db.query(sql)
|
|
new_id = @db.query("SELECT LAST_INSERT_ID() as id").first['id']
|
|
student.id = new_id.to_s
|
|
student
|
|
end
|
|
|
|
# Обновить студента по ID.
|
|
def update_student_by_id(id, new_student)
|
|
sql = <<~SQL
|
|
UPDATE student SET
|
|
git = '#{escape(new_student.git)}',
|
|
surname = '#{escape(new_student.surname)}',
|
|
name = '#{escape(new_student.name)}',
|
|
patronymic = '#{escape(new_student.patronymic)}',
|
|
birth_date = '#{new_student.birth_date}',
|
|
phone = #{new_student.phone ? "'#{escape(new_student.phone)}'" : "NULL"},
|
|
telegram = #{new_student.telegram ? "'#{escape(new_student.telegram)}'" : "NULL"},
|
|
email = #{new_student.email ? "'#{escape(new_student.email)}'" : "NULL"}
|
|
WHERE id = #{id}
|
|
SQL
|
|
|
|
@db.query(sql)
|
|
@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']
|
|
end
|
|
|
|
private
|
|
|
|
# Преобразование строки результата в объект Student.
|
|
def row_to_student(row)
|
|
Student.new(
|
|
id: row['id'].to_s,
|
|
git: row['git'],
|
|
surname: row['surname'],
|
|
name: row['name'],
|
|
patronymic: row['patronymic'],
|
|
birth_date: Date.parse(row['birth_date'].to_s),
|
|
phone: row['phone'],
|
|
telegram: row['telegram'],
|
|
email: row['email']
|
|
)
|
|
end
|
|
|
|
# Простой метод для экранирования строк (на практике лучше использовать подготовленные выражения).
|
|
def escape(value)
|
|
@db.client.escape(value.to_s)
|
|
end
|
|
end
|