Tương tự cho add_column, add_foreign_key, .... và các chức năng khác.
Nhanh, đơn giản, dễ sử dụng.
Tuy nhiên không phải tất cả migration được generate ra đều safe và good.
Gem strong_migrations được sử dụng để kiểm tra, phát hiện và ngăn các migraion này chạy.
Bạn có thể hiểu gem strong_migrations có tính năng như gem rubocop nhưng được dùng cho migration thay cho syntax, lint
2. Strong migration
a. Install
Thêm gem strong_migrations vào Gemile
# Gemfile
gem 'strong_migrations'
Chạy command để install gem strong_migrations
bundle install
b. Config
Chạy command để generate ra file config cho gem strong_migrations
rails generate strong_migrations:install
File config được gen ra có nội dung như sau
# config/initializers/strong_migrations.rb# Mark existing migrations as safeStrongMigrations.start_after =20210721142403# Set timeouts for migrationsStrongMigrations.lock_timeout =10.seconds
StrongMigrations.statement_timeout =1.hour
# Analyze tables after indexes are added# Outdated statistics can sometimes hurt performanceStrongMigrations.auto_analyze =true# Set the version of the production database# so the right checks are run in development# StrongMigrations.target_version = 10# Add custom checks# StrongMigrations.add_check do |method, args|# if method == :add_index && args[0].to_s == "users"# stop! "No more indexes on the users table"# end# end
Các config như StrongMigrations.start_after, StrongMigrations.lock_timeout được sử dụng để config gem strong_migrations
c. How it works
Các chức năng cơ bản của gem strong_migration bao gồm
Phát hiện các migration unsafe
Rails error và ngăn các migration unsafe được chạy
Hiển thị hướng dẫn để làm migration safe hơn
Tất cả các chức năng này được thực hiện khi bạn chạy command rails db:migrate các migration được khởi tạo sao StrongMigrations.start_after sẽ được check
3. Check
a. Removing a column
i. Bad
Migration được gen cho removing a column thường là
Khi migraion này được chạy sẽ rewrite lại toàn bộ table và lock table đến khi migration được chạy xong, các request từ app đến DB trong thời gian này sẽ bị timeout và raise exception
ii. Good
Tách thành 2 migration add_columnvà change_column_default