سؤال

أنا أستخدم 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 الوظيفة تعمل على ما يرام. لذلك ربما تكون المشكلة في الأحجار الكريمة وتحتاج إلى تقديم تذكرة.

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