2016-03-11 15 views
10

これはActiveRecordを使用してデータベースと通信するRubyの非Webプロジェクトです。ActiveRecord :: Migration非推奨警告 - Railsのバージョンを要求しますが、私はRailsを使用していません

db接続コード、移行、およびモデルを含む1つのファイルがあります。質問はこのラインについてです(それは質問に答えるために、これを読んでする必要はありません)

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バージョンを指定する必要がありますか?

答えて

31

アクティブレコードは、移行がどのバージョンで生成されたかを知りたいためです。時には、移行時のデフォルトがRailsリリース間で変更されることがあります(Railsリリースとは、Railsのリリースについてのことですが、宝石ではありません)。

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

そしてそれはActive Recordの4.2で作成した(したがって、4.2のリリースをレール):

それでは、あなたのような移行を持っているとしましょう。 Rails 4.2では、文字列のデフォルトサイズは4バイトです。 Rails 5.0では、Railsチームはデフォルトサイズを8バイトに変更することに決めました。この移行を5.0ロールバックにアップグレードして今すぐ実行すると、データベースに8バイトのサイズの文字列が追加されます。

移行でバージョンを指定した場合、その列を使用しているActive Recordのバージョンは常に、生成されたRailsのバージョンのデフォルトであるサイズで生成されます。私の例では、バージョンとして4.2を指定すると、常に4バイトの文字列になります。

+3

ワウ! @rafaelfranca!ここに説明してくれてありがとう..)+1 – uday

+2

レール外でARを使用している人にとっては混乱しますが、意味があります。 –

+0

@rafaelfranca宝石の保守担当者が両方のレールをサポートするために自動生成された移行スクリプトを更新する方法に関するアドバイス4。1歳以上、新しいRails移行API私がこれに使用したソリューションはハッキーです。例:Rails :: VERSION :: STRING [0..2] .to_f> = 5 active_record_migration_class = ActiveRecord :: Migration [Rails :: VERSION :: STRING [0..2] .to_f] その他 active_record_migration_class = ActiveRecord :: Migration end'''よりエレガントなものがありますか? – Kelseydh

3

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

ありがとうございます。私はこのエラーに遭遇し、最後にバージョンを追加してエラーをクリアしました。しかし、私の場合、Rails 5.1.4を実行していても、最後に[4.2]を追加する必要がありました。 –