2016-03-11 9 views
10

का उपयोग नहीं कर रहा हूं यह एक रूबी गैर-वेब प्रोजेक्ट है जो डेटाबेस से बात करने के लिए ActiveRecord का उपयोग करता है।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] 

और फिर मुझे चेतावनी नहीं मिलती है।

मुझे आश्चर्य है कि कोई इसका उद्देश्य बता सकता है या नहीं।

मेरा ऐप रेल के किसी भी संस्करण पर निर्भर नहीं है। मुझे एक रेल संस्करण निर्दिष्ट करने के लिए

क्यों चाहिए?

उत्तर

31

क्योंकि सक्रिय रिकॉर्ड जानना चाहता है कि माइग्रेशन किस संस्करण में उत्पन्न हुआ था। कभी-कभी माइग्रेशन में डिफॉल्ट रेल रिलीज़ के बीच बदल सकता है (जब मैं कहता हूं कि रेल रिलीज करता है तो मैं रेलवे की रिहाई के बारे में बात कर रहा हूं, मणि रेल नहीं करता)।

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

और यह सक्रिय रिकॉर्ड 4.2 के साथ जनरेट किया गया था (और इस प्रकार 4.2 रिलीज रेल):

तो मान लीजिए कि आप की तरह एक प्रवास डालते हैं। रेल 4.2 में, स्ट्रिंग कॉलम में 4 बाइट्स का डिफ़ॉल्ट आकार होता है। रेल 5.0 में, रेल टीम ने डिफ़ॉल्ट आकार को 8 बाइट्स में बदलने का फैसला किया। यदि आप इस माइग्रेशन को 5.0 रोलबैक में मणि अपग्रेड करते हैं और फिर से चलाते हैं तो आपके डेटाबेस में 8 बाइट आकार के साथ एक स्ट्रिंग कॉलम होगा।

यदि आप माइग्रेशन में संस्करण निर्दिष्ट करते हैं, इससे कोई फर्क नहीं पड़ता कि आप सक्रिय रिकॉर्ड का कौन सा संस्करण कॉलम का उपयोग कर रहे हैं, हमेशा उस आकार के साथ जेनरेट किया जाएगा जो इसे उत्पन्न होने वाले रेल के संस्करण में डिफ़ॉल्ट था। मेरे उदाहरण में, यदि आप संस्करण के रूप में 4.2 निर्दिष्ट करते हैं तो यह हमेशा एक 4 बाइट स्ट्रिंग कॉलम होगा।

+3

वाह! @rafaelfranca! यहां समझाए जाने के लिए धन्यवाद ..;) +1 – uday

+2

यह समझ में आता है हालांकि यह उन लोगों के लिए भ्रमित है जो रेल के बाहर एआर का उपयोग कर रहे हैं। –

+0

@rafaelfranca इस बात पर कोई सलाह है कि कैसे रत्न रखरखाव ऑटो-जेनरेट माइग्रेशन स्क्रिप्ट को रेल 4 दोनों का समर्थन करने के लिए अद्यतन कर सकते हैं।1 और पुराना, और नया रेल माइग्रेशन संस्करण एपीआई? इसके लिए मैंने जो समाधान उपयोग किए हैं वे हैंकी हैं। उदाहरण: '' 'यदि रेल :: संस्करण :: STRING [0..2] .to_f> = 5 active_record_migration_class = ActiveRecord :: माइग्रेशन [रेल :: संस्करण :: STRING [0..2] .to_f] अन्य active_record_migration_class = ActiveRecord :: माइग्रेशन एंड'' क्या कुछ और सुरुचिपूर्ण है? – Kelseydh

3

rails 4 से rails 5 के उन्नयन, तो आप सिर्फ संस्करण संख्या प्रवास करने की तरह जोड़ सकते हैं यदि ऐसा है तो रोलबैक या ड्रॉप के बाद:

रेल 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 

रेल 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

धन्यवाद। मैं इस त्रुटि में चल रहा था, और अंत में संस्करण जोड़ा और यह त्रुटि को मंजूरी दे दी। हालांकि, मेरे मामले में मुझे अंत में [4.2] जोड़ना पड़ा, भले ही मैं रेल 5.1.4 चला रहा हूं। –

संबंधित मुद्दे