Rails 2, переместить столбец данных в новую таблицу и удалить столбец - PullRequest
0 голосов
/ 13 февраля 2019

Я в Rails версии 2 (работаю над устаревшим проектом).

У меня уже есть таблица students, в которой есть столбец course это varchar(255) тип:

mysql> describe students;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| course         | varchar(255) | NO   |     | NULL    |                |
| age            | int(11)      | YES  |     | NULL    |                |

Теперь я хотел бы провести рефакторинг, чтобы каждый student мог иметь много курсов.Итак, я сначала создал файл миграции для создания таблицы courses:

class CreateCourse < ActiveRecord::Migration
  def self.up
      create_table :courses do |t|
          t.timestamps
          t.string :name, :null => false
          t.references :student, :null => false
      end
      add_index :courses, :student_id
  end

  def self.down
      drop_table :courses
  end
end

Я запускаю миграцию, таблица courses успешно создана.

В файле student.rb я также объявил:

class Student < ActiveRecord::Base
  has_many :courses
end 

Во вновь созданном файле course.rb у меня также есть:

class Course < ActiveRecord::Base
    belongs_to :student
end

Теперь я думаю, что мне нужно сделать две вещи:

  1. Мне нужно удалить столбец course varchar(255) из таблицы students, потому что он больше не нужен.Я предполагаю, что я просто пишу другую миграцию БД, должна это сделать.

  2. Переместить старые данные в новую таблицу courses.Для этого мне нужно переместить данные в предыдущем столбце course varchar(255) таблицы students во вновь созданный столбец courses таблицы name и заполнить соответствующим значением student_id в таблице courses.Как это сделать?

(Также, пожалуйста, поправьте меня, если я ошибаюсь выше. Спасибо.)

1 Ответ

0 голосов
/ 13 февраля 2019

Обратите внимание, что сначала вы должны сделать номер 2 , а затем номер 1 , иначе вы потеряете свои данные.

Вы можете сделать номер 2 в Railsconsole:

Student.all.each do |student|
  student.courses.create!(name: student.course)
end

Это может занять некоторое время, если ваша база данных слишком велика.После завершения этого процесса вы можете удалить столбец course из students.

Попробуйте выполнить в SQL:

def self.up
  execute <<-SQL
    INSERT INTO courses(name, student_id)
    SELECT DISTINCT s.course, s.id
    FROM students AS s
  SQL
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...