2016-03-11 12 views
10

Questo è un progetto non Web di Ruby che utilizza ActiveRecord per comunicare con il database.ActiveRecord :: Avviso di deprecazione della migrazione: richiede la versione di Rails, ma non utilizzo Rails

C'è un singolo file che contiene il codice di connessione db, la migrazione e il modello. Vedi qui (ma non è necessario leggere questo per rispondere alla domanda)

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 domanda è su questa linea:

class Migrations < ActiveRecord::Migration

Quando eseguo la migrazione con Migrations.migrate(:up), ho un deprecazione warning:

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] 

Piaccia ti ricorda cambiare la mia definizione di classe a

class Migrations < ActiveRecord::Migration[4.2] 

E quindi non ricevo più l'avviso.

Mi chiedo se qualcuno può spiegare lo scopo di questo.

La mia app non dipende da nessuna versione di Rails. Perché dovrei aver bisogno di

per specificare una versione di Rails?

risposta

31

Perché Active Record vuole sapere in quale versione sono state generate le migrazioni. A volte un default in una migrazione può cambiare tra i rilasci di Rails (quando dico rilasci di Rails parlo del rilascio di Rails the framework, non rota la gemma).

Quindi diciamo che avete una migrazione simile:

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

Ed è stata generata con Active Record 4.2 (e le rotaie quindi 4.2 release). In Rails 4.2, le colonne di stringhe hanno la dimensione predefinita di 4 byte. In Rails 5.0, il team Rails ha deciso di cambiare la dimensione predefinita in 8 byte. Se si aggiorna la gem al rollback 5.0 in questa migrazione e si esegue nuovamente, il database avrà una colonna di stringhe con 8 byte di dimensione.

Se si specifica la versione nella migrazione, indipendentemente dalla versione di Active Record in uso, la colonna verrà sempre generata con le dimensioni predefinite nella versione di Rails che è stata generata. Nel mio esempio, se si specifica 4.2 come versione, sarà sempre una colonna di stringhe di 4 byte.

+3

Wow! @rafaelfranca! grazie per aver spiegato qui ..;) +1 – uday

+2

Questo ha senso anche se è fonte di confusione per le persone che utilizzano AR al di fuori di binari. –

+0

@rafaelfranca Qualche consiglio su come i mantenitori di gem possono aggiornare gli script di migrazione generati automaticamente per supportare entrambi i binari 4.1 e precedenti e la nuova API di migrazione Rails? Le soluzioni che ho usato per questo sono hacky. Ad esempio: '' 'if Rails :: VERSION :: STRING [0..2] .to_f> = 5 active_record_migration_class = ActiveRecord :: Migration [Rails :: VERSION :: STRING [0..2] .to_f] altro active_record_migration_class = ActiveRecord :: Migration end''' C'è qualcosa di più elegante? – Kelseydh

3

Se l'aggiornamento da rails 4 a rails 5, si può semplicemente aggiungere il numero di versione alla migrazione in questo modo dopo il rollback o caduta:

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 
+0

Grazie. Stavo correndo questo errore, e ho appena aggiunto la versione alla fine e ha cancellato l'errore. Anche se, nel mio caso, ho dovuto aggiungere [4.2] alla fine, anche se eseguo Rails 5.1.4. –

Problemi correlati