У меня есть приложение Ruby on Rails (версия Rails: 5.1.1 и версия Ruby 2.3.1). Также, используя PostgreSQL, если это имеет значение. У меня проблемы с целостностью данных с таблицей сопоставления, которая отображает студентов на выбранные курсы, где столбец с именем ranking
неправильно содержит «пробелы» в рейтинге и должен быть исправлен, чтобы быть последовательным (для каждого учащегося) без пробелов.
Пример: Допустим, у меня есть таблица с именем student_course_rankings
, где студент выбирает несколько курсов и ранжирует их на основе своего любимого курса.
Существует уникальное ограничение для (student_id, course_id, ranking)
, поэтому студент не может выбрать один и тот же курс дважды.
ranking
столбец просто имеет ограничение NOT NULL
, но не имеет других ограничений и имеет тип integer
.
Каков наилучший способ сделать это в Ruby Migration?
class FixStudentCourseRankings < ActiveRecord::Migration[5.1]
def change
# Deletes duplicate courses (keeps the first)
StudentCourse.where.not(
id: StudentCourse.group(:course_id, :student_id).pluck('min(student_courses.id)')
).delete_all
# Adds unique constraint so students can't accidentally select the same course more than once
add_index :student_courses, [:course_id, :student_id, :ranking], :unique => true
# HERE: Fix ranking order???
end
end
Ниже приведена упрощенная версия моей таблицы и того, как она в настоящее время выглядит с двумя студентами.
id | student_id | course_id | ranking
----+------------+-----------+---------
1 | 1 | 2 | 1
2 | 1 | 3 | 2
3 | 1 | 5 | 4
4 | 1 | 9 | 5
5 | 1 | 6 | 6
6 | 2 | 3 | 2
7 | 2 | 6 | 4
8 | 2 | 5 | 5
Как я хочу, чтобы это действительно выглядело:
id | student_id | course_id | ranking
----+------------+-----------+---------
1 | 1 | 2 | 1
2 | 1 | 3 | 2
3 | 1 | 5 | 3
4 | 1 | 9 | 4
5 | 1 | 6 | 5
6 | 2 | 3 | 1
7 | 2 | 6 | 2
8 | 2 | 5 | 3
Любая помощь будет принята с благодарностью!