update tutorial rails generate active ruby-on-rails activerecord ruby-on-rails-5

ruby on rails - tutorial - Advertencia de desaprobación de ActiveRecord:: Migration: pregunta por la versión de Rails, pero no estoy usando Rails



ruby on rails tutorial (2)

Porque Active Record quiere saber en qué versión se generaron las migraciones. A veces, un defecto en una migración puede cambiar entre lanzamientos de Rails (cuando digo versiones de Rails, estoy hablando sobre el lanzamiento de Rails en el framework, no sobre la gema).

Entonces digamos que tienes una migración como:

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

Y se generó con Active Record 4.2 (y, por tanto, Rails versión 4.2). En Rails 4.2, las columnas de cadenas tienen el tamaño predeterminado de 4 bytes. En Rails 5.0, el equipo de Rails decidió cambiar el tamaño predeterminado a 8 bytes. Si actualiza la gema a 5.0, retrotrae esta migración y la ejecuta nuevamente, su base de datos tendrá una columna de cadena con 8 bytes de tamaño.

Si especifica la versión en la migración, no importa qué versión de Active Record esté utilizando la columna, siempre se generará con el tamaño que era el predeterminado en la versión de Rails que se generó. En mi ejemplo, si especifica 4.2 como la versión, siempre será una columna de cadena de 4 bytes.

Este es un proyecto no web de Ruby que usa ActiveRecord para hablar con la base de datos.

Hay un solo archivo que contiene el código de conexión db, la migración y el modelo. Vea aquí (pero no es necesario leer esto para responder la pregunta)

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

La pregunta es sobre esta línea:

class Migrations < ActiveRecord::Migration

Cuando ejecuto la migración con Migrations.migrate(:up) , recibo una advertencia de desaprobación:

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]

Me gusta que cambie mi definición de clase a

class Migrations < ActiveRecord::Migration[4.2]

Y luego ya no recibo la advertencia.

Me pregunto si alguien puede explicar el propósito de esto.

Mi aplicación no depende de ninguna versión de Rails. Por qué necesitaría

para especificar una versión de Rails?


Si se actualiza de los rails 4 a los rails 5 , puede simplemente agregar el número de versión a la migración, de manera que después de deshacer o soltar:

Rieles 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

Rieles 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