سؤال

من ذوي الخبرة مع القضبان / ActiveRecord 2.1.1

  • يمكنك إنشاء النسخة الأولى مع (على سبيل المثال) روبي النصي\توليد سقالة عنوان المنتج:سلسلة الوصف:نص image_url:سلسلة
  • هذا إنشاء (على سبيل المثال) الهجرة ملف يسمى 20080910122415_create_products.rb
  • تطبيق الهجرة مع أشعل النار db:ترحيل
  • الآن يمكنك إضافة حقل إلى الجدول المنتج مع روبي النصي\توليد الهجرة add_price_to_product السعر:العشرية
  • هذا خلق الهجرة ملف يسمى 20080910125745_add_price_to_product.rb
  • إذا حاولت تشغيل أشعل النار db:الهجرة ، فإنه في الواقع تعود أول الهجرة لا تنطبق واحد القادم!لذلك الجدول المنتج سوف تحصل على تدميرها!
  • ولكن إذا قمت بتشغيل أشعل النار وحده ، قد قال لك هذا واحد الهجرة انتظار

الثابتة والمتنقلة ملاحظة أن تطبيق أشعل النار db:ترحيل (مرة واحدة في الجدول تم تدميرها) سيتم تطبيق جميع الهجرات في النظام.

الحل الوحيد لقد وجدت هو تحديد النسخة الجديدة من الهجرة كما في:

rake db:migrate version=20080910125745

لذلك أنا أتساءل:هذا هو المتوقع الجديدة السلوك ؟

هل كانت مفيدة؟

المحلول

يجب أن تكون قادرا على استخدام

rake db:migrate:up 

لإجبارها على الذهاب إلى الأمام, لكن هل خطر في عداد المفقودين معشق الهجرات من أشخاص آخرين على فريقك

إذا قمت بتشغيل

rake db:migrate 

مرتين ، فإنه سيتم تطبيق كل ما تبذلونه من الهجرات.

واجهت نفس المشكلة على ويندوز مع SQLite, قد يكون الخلل محددة إلى مثل هذه البيئة.

تحرير -- لقد وجدت السبب.في railstie قاعدة البيانات الخاصة بنا.الخليع المهمة لديك التعليمات البرمجية التالية :

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
task :migrate => :environment do
  ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
  ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
  Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end

ثم في متغيرات البيئة لدي

echo %Version% #=> V3.5.0f

في روبي

ENV["VERSION"] # => V3.5.0f
ENV["VERSION"].to_i #=>0 not nil !

مما أشعل النار المكالمات المهمة

ActiveRecord::Migrator.migrate("db/migrate/", 0)

و في ActiveRecord::مرحل لدينا :

class Migrator#:nodoc:
  class << self
    def migrate(migrations_path, target_version = nil)
      case
        when target_version.nil?              then up(migrations_path, target_version)
        when current_version > target_version then down(migrations_path, target_version)
        else                                       up(migrations_path, target_version)
      end
    end

نعم ، rake db:migrate VERSION=0 هو نسخة طويلة من أجل rake db:migrate:down

تحرير - أود أن أذهب تحديث المنارة علة لكني سوبر وكيل الشركة يمنع أن أقوم بتوصيل هناك

في هذه الأثناء يمكنك محاولة ضبطه النسخة قبل الاتصال الهجرة ...

نصائح أخرى

أنا اختلف توم!هذا هو الخلل !!V3.5.0 و ليست صالحة نسخة أشعل النار الهجرات.أشعل النار لا ينبغي استخدامه إلى الهجرة:أسفل فقط لأن روبي اختارت أن نعتبر أن "V3.5.0 f".to_i 0 ...

أشعل النار يجب بصوت عال يشكون من أن النسخة غير صالحة بحيث يمكن للمستخدمين معرفة ما هو حتى (بيني و بينك التحقق من أن الإصدار هو YYYYMMDD منسقة الزمني عن طريق تحويل إلى عدد صحيح هو الضوء قليلا)

[اللعنة IE6 التي لن تسمح لي أن أعلق !و لا أستطيع تغيير المتصفح شكرا الشركات]

ليس هذا هو السلوك المتوقع.كنت سأقترح الإبلاغ عن هذا الخلل على المنارة ، ولكن أرى أنك قد قد فعلت ذلك!إذا توفر المزيد من المعلومات (بما في ذلك نظام التشغيل/قاعدة بيانات/نسخة روبي) أنا سوف نلقي نظرة على ذلك.

جان ،

شكرا جزيلا على التحقيق الخاص بك.أنت على حق, و في الواقع لقد كشفت أشد علة من الأنواع تصميم علة'.

ما يحدث هو أن أشعل النار سوف انتزاع أي قيمة يمكنك تمرير إلى سطر الأوامر وتخزينها كما متغيرات البيئة.أشعل النار المهام التي سوف تحصل في نهاية المطاف دعا مجرد سحب هذه القيم من متغير البيئة.عندما db:ترحيل الاستفسارات ENV["نسخة"], أنها في الواقع تطلب النسخة المعلمة التي يمكنك تعيين الدعوة أشعل النار.عند استدعاء أشعل النار db:الهجرة, لا تمر أي إصدار.

ولكن لدينا بيئة متغير يسمى الإصدار الذي تم إعداده لأغراض أخرى من قبل بعض البرامج الأخرى (لا أي واحد حتى الآن).و الرجال وراء الخليع (أو خلف قاعدة البيانات الخاصة بنا.أشعل النار) لم أحسب أن هذا سيحدث.هذا تصميم علة.على الأقل أنها يمكن أن تستخدم أكثر تحديدا متغير أسماء مثل "RAKE_VERSION" أو "RAKE_PARAM_VERSION" بدلا من مجرد "نسخة".

توم, أنا سوف بالتأكيد ليست قريبة ولكن تحرير تقرير الشوائب على منارة تعكس هذه النتائج الجديدة.

و شكرا مرة أخرى جان على مساعدتك.لقد نشرت هذا الخطأ على المنارة مثل 5 أيام للمشاركين و لا يزال حصلت على أي جواب!

رولو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top