ActivereCord counter_cache إعطاء عدد لا معنى له مع multi_db gem
-
20-09-2019 - |
سؤال
أنا أستخدم GEM Multi-DB مع النسخ المتماثل SLONY-I على postgresql في تطبيق Rails. هذا يعمل في الغالب بشكل مثالي ، ولكن هناك القليل من تأخر النسخ المتماثل في بعض الحالات. واحدة من الحالات تنطوي على ActivereCord counter_cache.
من أجل الوضوح ، افترض النموذجين التاليين:
class Post < ActiveRecord::Base
has_many :comments
...
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true, :touch => true
...
end
بعد إنشاء تعليق ، يتم استدعاء RJS لتحديث التعليقات مع:
@comment.post.comments_count
مع إيقاف تشغيل Multi-DB (أو إدخال قاعدة بيانات الرقيق التي تشير إلى Master DB) ، يعمل هذا بشكل جيد. لذا ، جربت شيئًا كهذا:
ActiveRecord::Base.connection_proxy.with_master do
post=@comment.post
count=post.comments_count
end
هذا لا يزال يعطي نتيجة قديمة. كما هو الحال:
config.cache_classes = false
يبدو أن الدعوة إلى with_master
لا يعمل. أي نصيحة حول كيفية تحديد قاعدة البيانات المتعددة التي تستخدمها؟ أو ، بدلاً من ذلك ، حول كيفية التعامل مع مثل هذه القضايا؟
المحلول
في تجربتي ، كلما احصلت على حالات استخدام القضبان "السائدة" أو مزيد من الإضافات التي تكدسها ، كلما كان عليك الاعتماد على الوظائف المتقدمة لجميع العمل معًا. هذا صحيح بشكل خاص مع ActivereCord Magic.
إذا كان من المهم أن يظل عدد التعليقات على اطلاع دائم ، فقم بذلك بشكل صريح. تخلص من counter_cache وتنفيذ after_create
و after_destroy
عوامل الاسترجاعات في نموذج التعليق الخاص بك والتي تزيد من حقل العد في نموذج النشر الخاص بك وتقليله. (أو ، ربما أكثر موثوقية ، قم بتعيينهم على العد المعاد حسابه لهذا النطاق.) يبدو أقل بقعة ولكن من غير المحتمل أن يفشل في ظل أي مجموعة معقولة من التبعيات.
نصائح أخرى
لست متأكدًا مما إذا كان هذا هو الحل الذي تتبعه ، لكني أستخدمه الماسوشية لتكرار DB الخاص بي ، و counter_cache
الوظيفة تعمل على ما يرام. لذلك ربما تكون المشكلة في الأحجار الكريمة وتحتاج إلى تقديم تذكرة.