Подтвердить что ты не робот

ActiveRecord:: Предупреждение о переносе миграции - запрашивает версию Rails, но я не использую Rails

Это не-веб-проект Ruby, который использует ActiveRecord для разговора с базой данных.

Существует один файл, который содержит код подключения, миграцию и модель. См. Здесь (но не обязательно читать это, чтобы ответить на вопрос)

require 'sqlite3'
require 'active_record'
require 'yaml'
require 'active_support/all'
require 'securerandom'

BasePath = "#{File.dirname(__FILE__)}/.."
DATABASE_FILENAME = "database.sqlite"
DATABASE_PATH = "#{BasePath}/#{DATABASE_FILENAME}"
SQLite3::Database.new(DATABASE_PATH)
ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: DATABASE_PATH
)

class Migrations < ActiveRecord::Migration
  def up
    create_table :todos do |t|
      t.string :content
      t.boolean :completed
      t.timestamps null: false
    end
  end
  def down
    puts "backing up database".red_on_black if File.file?(DATABASE_PATH)
    loop { (`cp #{DATABASE_PATH} #{DATABASE_PATH}-#{SecureRandom.urlsafe_base64}.backup`; break) rescue next }
    sleep 0.5
    drop_table :todos
    puts "dropped todos table"
  end
end # Migrations

class Todo < ActiveRecord::Base
end

Вопрос о этой строке:

class Migrations < ActiveRecord::Migration

Когда я запускаю миграцию с помощью Migrations.migrate(:up), я получаю предупреждение об отказе:

DEPRECATION WARNING: Directly inheriting from ActiveRecord::Migration is deprecated.
Please specify the Rails release the migration was written for:

  class Migrations < ActiveRecord::Migration[4.2]

Как и в рекомендациях, я меняю определение класса на

  class Migrations < ActiveRecord::Migration[4.2]

И тогда я больше не получаю предупреждение.

Мне интересно, может ли кто-нибудь объяснить цель этого.

Мое приложение не зависит от какой-либо версии Rails. Зачем мне нужно

чтобы указать версию Rails?

4b9b3361

Ответ 1

Поскольку Active Record хочет знать, в какой версии были созданы миграции. Иногда по умолчанию в миграции может меняться между выпуском Rails (когда я говорю Rails-релизы, я говорю о выпуске Rails framework, а не в рельсах).

Итак, скажем, у вас есть миграция вроде:

create_table :todos do |t|
  t.string :content
end

И он был сгенерирован с помощью Active Record 4.2 (и, следовательно, Rails 4.2 release). В Rails 4.2 столбцы строк имеют размер по умолчанию 4 байта. В Rails 5.0 команда Rails решила изменить размер по умолчанию на 8 байтов. Если вы обновите gem до 5.0 rollback, эта миграция и снова запустите, ваша база данных будет иметь строковый столбец размером 8 байт.

Если вы укажете версию в переносе, независимо от того, какая версия Active Record вы используете столбец, всегда будет генерироваться с размером, который был по умолчанию в версии Rails, который был сгенерирован. В моем примере, если вы укажете 4.2 как версию, он будет всегда столбцом строки в 4 байта.

Ответ 2

Если вы обновляетесь с rails 4 до rails 5, вы можете просто добавить номер версии в миграцию, например, после отката или отбрасывания:

Rails 4.2.6

class CreateStudents < ActiveRecord::Migration
  def change
    create_table :students do |t|
      t.belongs_to :user, index: true
      t.string :first_name
      t.string :last_name
      t.string :phone
      t.timestamps null: false
    end
  end
end

Rails 5.1.3

class CreateStudents < ActiveRecord::Migration[5.1]
  def change
    create_table :students do |t|
      t.belongs_to :user, index: true
      t.string :first_name
      t.string :last_name
      t.string :phone
      t.timestamps null: false
    end
  end
end