تعمل أدوات التحقق من صحة نموذج Rails على كسر عمليات الترحيل السابقة

StackOverflow https://stackoverflow.com/questions/62038

سؤال

لدي سلسلة من عمليات الترحيل في تطبيق Rails والتي تتضمن الخطوات التالية:

  1. إنشاء نسخة أساسية من نموذج "المستخدم".
  2. قم بإنشاء مثيل لهذا النموذج - يجب أن يكون هناك مستخدم أولي واحد على الأقل في نظامي حتى تتمكن من تسجيل الدخول والبدء في استخدامه
  3. قم بتحديث نموذج "المستخدم" لإضافة حقل/عمود جديد.

أنا الآن أستخدم "validates_inclusion_of" في هذا الحقل/العمود الجديد.لقد نجح هذا بشكل جيد على جهاز التطوير الأولي الخاص بي، والذي كان يحتوي بالفعل على قاعدة بيانات مع تطبيق عمليات الترحيل هذه.ومع ذلك، إذا ذهبت إلى جهاز جديد وقمت بتشغيل جميع عمليات الترحيل، فستفشل الخطوة 2، بسبب فشل validates_inclusion_of، لأن الحقل من الترحيل 3 لم تتم إضافته إلى فئة النموذج بعد.

كحل بديل، يمكنني التعليق على سطر "validates_..." وتشغيل عمليات الترحيل وإلغاء التعليق عليه، لكن هذا ليس جيدًا.

من الأفضل إعادة ترتيب عمليات الترحيل الخاصة بي بحيث يأتي إنشاء المستخدم (الخطوة 2) أخيرًا، بعد إضافة جميع الأعمدة.

أنا مبتدئ في Rails، لذا فكرت في أن أسأل ما هي الطريقة المفضلة للتعامل مع هذا الموقف :)

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

المحلول

أسهل طريقة لتجنب هذه المشكلة هي استخدام rake db:schema:load على الجهاز الثاني، بدلاً من db:migrate.يستخدم D:S:L schema.rb لتحميل الإصدار الأحدث من مخططك، بدلاً من ترحيله إلى أعلى من البداية.

إذا واجهت هذه المشكلة عند النشر إلى جهاز إنتاج (حيث يكون الحفاظ على البيانات أمرًا مهمًا)، فمن المحتمل أن يتعين عليك دمج عمليات الترحيل في ملف واحد دون حدوث تعارضات.

نصائح أخرى

يمكنك الإعلان عن فئة بنفس الاسم داخل عملية الترحيل، وسوف تتجاوز التطبيق/النماذج الخاصة بك:

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

  def self.up
    # User.create(:name => 'admin')
  end

end

لسوء الحظ، قد يحاول IDE الخاص بك الإكمال التلقائي بناءً على هذه الفئة (يفعل Netbeans) ولا يمكنك استخدام منطق النموذج الخاص بك هناك (إلا إذا قمت بتكراره).

لا بد لي من القيام بذلك الآن.بناءً على نصيحة BiHi، أقوم بتحميل النموذج يدويًا ثم أعيد تحديد الطرق حيث أحتاج إلى ذلك.

load(File.join(RAILS_ROOT,"app/models/user.rb"))
class User < ActiveRecord::Base
  def before_validation; nil; end # clear out the breaking before_validation
  def column1; "hello"; end       # satisfy validates_inclusion_of :column1
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top