استمرار عمود الحالة عند الانتقال باستخدام Rubyist-aasm (يعمل كجهاز حالة)

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

سؤال

ما هي أفضل طريقة للاحتفاظ بحالة الكائن في قاعدة البيانات عند الانتقال باستخدام aasm؟لقد اعتقدت أن هذا سيحدث تلقائيًا ولكن لا يبدو أن هذا هو الحال.

(يحرر:عندما أقوم بحفظ الكائن يدويًا، يتم تحديث عمود الحالة.ولكن لا يتم الحفظ في التحولات.)

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

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

المحلول

إذا كنت استدعاء النموذج <م> فرقعة! للأسلوب الحدث الانتقالية، فإن الدولة سوف تستمر. على سبيل المثال، نقول لديك كائن مع الحدث التالي:

class Book < ActiveRecord::Base
  # ... 

  aasm_event :close do
    transitions :to => :closed, :from => [:opened]
  end

  # ...
end
سوف

ودعوة book.close تعيين حالة إلى closed، ولكن لن ينقذ تلقائيا. وسوف تدعو book.close! تعيين حالة * و * تلقائيا حفظ الكائن AR.

نصائح أخرى

وكما يقترح كولن، فإن AASM ستستمر في إجراء تغييراتك نيابةً عنك.ما قاله ماركوس غير صحيح تمامًا، باستثناء حقيقة أن الإصدار الأخير من الجوهرة به خطأ.

في السطر 180 من lib/persistence/active_record_persistence.rb (يمكنك الحصول على هذا عن طريق تشغيل Gem:unpack)، من المفترض أن ترى التعليق الذي ينص على ما يلي:

يكتب الحالة إلى عمود الحالة ويستمر في قاعدة البيانات باستخدام update_attribute (الذي يتجاوز التحقق من الصحة)

ومع ذلك، في التعليمات البرمجية، فإنه في الواقع يستدعي حفظ بدلاً من ذلك!

unless self.save

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

unless self.save(false)

الآن، تقوم التحولات بالفعل بحفظ الحالة الجديدة في قاعدة البيانات.

وأعتقد أن AASM تستمر حالة الكائن بعد المرحلة الانتقالية. رؤية خطوط 180-189 في AASM / ليب / استمرار / active_record_persistence.rb

وأعتقد أن لديك لانقاذ في الانتقال إذا كان هذا هو التأثير الذي تريد. أكتيفيريكورد (التي AASM يجلس على رأس) لا الحفظ التلقائي السجلات، حسب التصميم.

ويمكنك القيام الادخار في <لأ href = "http://rails.aizatto.com/2007/05/24/ruby-on-rails-finite-state-machine-plugin-acts_as_state_machine/" يختلط = "نوفولو noreferrer"> رد إذا تريد (وهذا يبدو مثلك).

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