سؤال

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

بـ "السمات الصالحة"، أعني تلك السمات التي تعطي صفرًا عند استدعاء @model_instance.errors.on(:attribute)

هل لدى أي شخص فكرة عن كيفية تحقيق ذلك؟

حتى الآن لدي ما يلي:

def save_valid_attributes 
 valid? 
 update_atrtibutes attributes.inject({}){|k, v, m| m[k] = v unless errors_on(k.to_sym); m} 
end 

يعمل هذا إذا لم تكن هناك معالجة يتم إجراؤها عند المهمة، وهو ما يحدث في حالتي.على سبيل المثال، لدي عمود قاعدة بيانات "start_date"، وتم تحديد طريقتين:

def nice_start_date=(startdate)
 self.start_date = Chronic.parse(startdate) || startdate
end

def nice_start_date
 self.start_date.to_s
end

تسمح لي هاتان الطريقتان بتحليل التواريخ التي أدخلها المستخدم بشكل صحيح باستخدام Chronic قبل الحفظ.لذا، الطريقة الثانية للقيام بذلك، سمة واحدة في كل مرة:

def save_valid_attributes(attrib) 
  valid?
  attrib.each{|(k,v)| send("${k}=", v); save; reload)
end

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

هل هناك طريقة أفضل للقيام بذلك؟أنا متأكد من أن هذه ليست مشكلة غير شائعة في عالم Rails، ولكن يبدو أنني لا أستطيع العثور على أي شيء في عالم المعرفة في Google.

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

المحلول

لست متأكدًا من مقدار الحظ الذي ستحظى به مع هذا دون الكثير من العبث.

بغض النظر عن مدى سهولة DRY وOO وسهولة إطار العمل الخاص بك في صنع الأشياء (وهو في هذه الحالة - كثيرًا =) فلا يزال يتعين عليك أن تتذكر أنه يعمل أمام قاعدة بيانات علائقية ذات معايير مستنقع، والتي تحتوي على التزامات ذرية كواحدة منها تعريف سمات.لقد تم تصميمه من الألف إلى الياء للتأكد من تنفيذ جميع التغييرات أو عدم الالتزام بها على الإطلاق.

ستتجاوز فعليًا هذه الوظيفة القياسية بشيء يتعارض بنسبة 100% مع طبيعة كيفية تصميم Rails + للعمل.من المحتمل أن يؤدي هذا (كما قيل بالفعل) إلى بيانات غير متسقة.

وقد قلت ذلك ...فمن الممكن دائما.أود أن أتطلع إلى إجراء التحقق اليدوي من السمات التي تهمك، ثم استخدام الطريقة المضمنة object.update_attribute_with_validation_skipping.

حظ سعيد!

نصائح أخرى

يمكنك الكتابة فوق #save مثله:

def save
  errors.each do |attr, msg|
    send("#{attr}=", send("#{attr}_was"))
  end
  super
end

سيؤدي هذا إلى إعادة تعيين جميع السمات التي تحتوي على أخطاء مرتبطة بقيمتها الأصلية.

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