سؤال

أن تكون أكثر تحديدا ، "كيف يمكنني التحقق من صحة هذا النموذج يتطلب على الأقل x صالح المرتبطة نماذج خلقت؟".كنت أحاول التحقق من صحة متداخلة النماذج التي تم إنشاؤها في نفس شكل الوالد (وفي نهاية المطاف تظهر فورا التصديقات a la مسج).كما شعبية سبيل المثال, لنفترض النماذج التالية و مخطط.

class Project
  include DataMapper::Resource

  property :id,     Serial
  property :title,  String, :nullable => false

  has 2..n, :tasks
end

class Task
  include DataMapper::Resource

  property :id,         Serial
  property :project_id, Integer,  :key => true
  property :title,      String,   :nullable => false

  belongs_to :project
end

جميع التصديقات تتم في المخطط تعريفات, كما ترون.المهم هنا هو "has 2..n, :tasks".هذا التحقق في الواقع يعمل بشكل طبيعي بالنظر إلى أن المتداخلة سمات مهمة في params التجزئة سوف تنتج صالح المهام.إذا أنها تنتج صالح المهمة بيد أن المهمة لن تحصل على إنشاء عليك في نهاية المطاف مع المشروع الذي يحتوي على أقل من 2 المهام ، وبالتالي صالح كائن المشروع.

كما أفهم أن هذا هو لأنه لا يمكن معرفة إذا كانت المهمة سمات صالحة أو حتى محاولات لإنقاذ المهام منذ بقدر ما أعرف - المهام لا يمكن الحصول على حفظها قبل المشروع المشروع هو علم إذا كان المهام سوف تكون صالحة أو لا.أليس هذا ؟

على كل حال كنت أتمنى أن يكون هناك إجابة سريعة ، ولكن يبدو أقل كثيرا تافهة ثم تمنيت.إذا كنت قد حصلت على أي اقتراحات في كل ذلك سيكون موضع تقدير كبير.

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

المحلول

أنا فعلا وجدت لطيفة الحل هنا باستخدام المعاملات في DataMapper.في الأساس هذه الصفقة يحاول حفظ الكائن الأصل وكذلك جميع الكائنات التابعة.في أقرب وقت واحد فشل في حفظ ، ثم الصفقة يتوقف أي شيء خلق.إذا سارت الامور بشكل جيد, ثم الكائنات سيوفر بنجاح.

class Project
  def make
    transaction do |trans|
      trans.rollback unless save
      tasks.each do |task|
        unless task.save
          trans.rollback
          break
        end
      end
    end
  end
end

وهذا يؤكد أن كل ما هو صالح قبل أي شيء يحصل حفظها.أنا فقط بحاجة إلى تغيير بلدي #حفظ #تحديث أساليب #في بلادي تحكم التعليمات البرمجية.

نصائح أخرى

مجموعة القيود المؤجلة قد تكون مفيدة إذا كان لديك قاعدة بيانات المحرك يدعم ذلك.

وإلا ربما كتابة الإجراء المخزن للقيام إدراج ، ثم يقول أن resonsibility الإجراء المخزن لضمان الوحيد الصحيح, التحقق من صحة البيانات المدرجة.

هناك نموذج من طريقة valid? التي تدير التصديقات على نموذج كائن قبل حفظه.لذا, طريقة بسيطة للتحقق من الجمعيات استخدام validates_with_block' or 'validates_with_method للتحقق من التصديقات على الجمعيات.

سوف ننظر بشيء من هذا القبيل

validates_with_block do
  if @tasks.all?{|t|t.valid?}
    true
  else
    [false, "you have an invalid task"]
  end
end

أو هل يمكن أن ننظر dm-جمعية-المصادقة أو dm-يقبل-متداخلة-سمات

تحرير: لمزيد من مجنون.تشغيل التصديقات على المهام ، ثم تحقق لمعرفة ما إذا كانت الأخطاء فقط هي تلك المتعلقة الجمعية.

validates_with_block do
  if @tasks.all?{|t|t.valid?;!t.errors.any?{|e|e[0]==:project}}
    true
  else
    [false, "you have an invalid task"]
  end
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top