Как выполнить SQL команды в миграции Rails: руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для выполнения чистого SQL-кода в Rails миграции воспользуйтесь методом execute:

ruby
Скопировать код
class AddUsersTable < ActiveRecord::Migration[6\.0]
  def change
    execute 'CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(100));'
  end
end

Обращу ваше внимание на:

  • Метод change, который обеспечивает как применение, так и откат миграции — Rails понимает, как его отменить.
  • Если SQL-команда небольшая по размеру, вполне можно записать ее в одной строке.
Кинга Идем в IT: пошаговый план для смены профессии

Расширенные сценарии: использование чистого SQL

В миграциях SQL неограничено в возможностях: можно использовать не только метод execute. Существуют различные подходы, выбор которых зависит от сложности задачи и специфических требований вашего проекта.

Переименование таблицы и трансформация данных

Если вы не просто переименовываете таблицу, но еще и преобразуете в ней данные, схема может выглядеть так:

ruby
Скопировать код
class RenameAndTransformUsersTable < ActiveRecord::Migration[6\.0]
  def up
    execute <<-SQL
      CREATE TABLE new_users AS
      SELECT id, name, 'unknown' as email FROM users;
    SQL
    drop_table :users
    rename_table :new_users, :users
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

Изменения, легко откатываемые благодаря блоку reversible

Если вы используете Rails 4 или более новую версию, можете смело применять блоки reversible для изящного и легко откатываемого внесения изменений.

ruby
Скопировать код
class AddPartNumberToProducts < ActiveRecord::Migration[6\.0]
  def change
    reversible do |dir|
      dir.up { execute 'ALTER TABLE products ADD COLUMN part_number STRING' }
      dir.down { execute 'ALTER TABLE products DROP COLUMN part_number' }
    end
  end
end

Улучшение читаемости сложных SQL-команд с использованием here-docs

Сложные и многошаговые SQL-команды становятся более читаемыми благодаря применению here-docs:

ruby
Скопировать код
class MultiStepSQL < ActiveRecord::Migration[6\.0]
  def change
    execute <<-SQL
      DROP TABLE IF EXISTS old_users;
      CREATE TABLE new_users (LIKE users INCLUDING ALL);
      INSERT INTO new_users SELECT * FROM users;
    SQL
  end
end

Визуализация

При создании SQL-миграции в Rails советую следовать следующим шагам:

Markdown
Скопировать код
🛤️🚀 Пришло время миграции! 🚀🛤️

1. Определите действие: **create_table**, **add_column**
2. Компонуйте путь: используйте **execute 'SQL'**
3. Обеспечьте плавность процесса: учтите **проверки безопасности** и предусмотрите возможность отката.

При применении Rails Migrations вы предоставляете надежный способ управления миграцией данных в вашем приложении.

Освоение миграций: ключ к универсальности

Создание обратимых изменений

При использовании SQL для манипуляций со структурой базы данных важно формировать обратимые изменения:

ruby
Скопировать код
class ChangeUsersTableName < ActiveRecord::Migration[6\.0]
  def change
    rename_table :users, :accounts
  rescue
    raise ActiveRecord::IrreversibleMigration
  end
end

Баланс между безопасностью данных и структурными изменениями

Манипулируя структурой таблиц, приоритетным становится вопрос защиты данных:

ruby
Скопировать код
class AddDefaultValue < ActiveRecord::Migration[6\.0]
  def change
    add_column :users, :active, :boolean, default: true
    User.update_all(active: true) # запускаем заполнение данными
  end
end

Полезные материалы

  1. Active Record Migrations — Ruby on Rails Guides — практическое руководство по использованию миграций в Rails.
  2. ActiveRecord::Migration – APIdock — ценный ресурс для получения информации о методах и общения с профессиональным сообществом.
  3. Newest 'rails-migrations' Questions – Stack Overflow — место, где можно найти ответы и обсудить вопросы, связанные с миграциями.
  4. ActiveRecord::Migration — официальная документация API по миграциям Rails.
  5. thoughtbot — советы по созданию эффективных миграций от известной IT-компании.
  6. GitHub – rubocop/rails-style-guide: Migrations — лучшие практики по поддержанию миграций в актуальном и работоспособном состоянии.