التحقق من صحة متداخلة النماذج ؟
-
05-07-2019 - |
سؤال
أن تكون أكثر تحديدا ، "كيف يمكنني التحقق من صحة هذا النموذج يتطلب على الأقل 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