سؤال

وأنا أبحث عن وسيلة لتخزين عدد كل دولة. وقد فعلت مكافحة التخزين المؤقت من قبل، ولكن هناك وسيلة لإنشاء أعمدة counter_cache متعددة لكل دولة والاحتفاظ بها وتحديثها أو ينبغي أن نبحث في مكان آخر للتخزين المؤقت هذه القيم.

aasm_column :state
aasm_initial_state :unopened

aasm_state :unopened
aasm_state :contacted
aasm_state :closed

aasm_event :contact do
  transitions :to => :contacted, :from => [:unopened] 
end

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

ويبدو أنه سيكون مجرد 3 أعمدة في قاعدة البيانات. أي أفكار؟

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

المحلول

ويمكنك ان تقوم بذلك ثلاثة أعمدة، واحد لكل دولة، ولكن الكتابة المنطق يدويا لزيادة / إنقاص تلك العدادات، وذلك باستخدام وظائف الكائن القذرة. القضبان لا توفر أي منطق التلقائي في save للقيام بذلك.

وحتى في نموذج يتم عدها:

after_create :increment_counter
after_save :update_counters
after_destroy :decrement_counter

def increment_counter
  self.parent.increment("#{self.state}_counter")
end

def decrement_counter
  self.parent.decrement("#{self.state}_counter")
end

def update_counters
  return unless self.state_changed?
  self.parent.decrement("#{self.state_was}_counter")
  self.parent.increment("#{self.state}_counter")
end

و(هذا الرمز لم تختبر، ولكن هذه هي الفكرة الأساسية)

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