مرحبًا،
لقد صادفت استعلامًا غريبًا لا أعرف حقًا كيف أعالجه باستخدام استعلام SQL أو Active Record فقط.
لدي مواضيع مع حقول مخصصة، وأحتاج إلى فرز البيانات باستخدام قيمة الحقل المخصص ‘importedSortDate’.
الكود الأولي:
Topic.where(‘category_id in (?)’, [cat_id])
.where(‘closed = ?’, false)
.order(‘created_at desc’)
.limit(10)
كيف يمكنني تعديل هذا الاستعلام أو إضافة شيء إليه لتحميل هذه الـ 10 مواضيع فقط في الذاكرة، وليس أكثر؟
بما أن قالب جدول الحقول المخصصة غريب بعض الشيء، بمعنى أنه يحتوي على عمود للاسم وعمود للقيمة، فأنا عالق قليلًا بشأن كيفية إدارة ذلك كله باستخدام استعلام قاعدة البيانات.
مشكلتي مع تحميل المزيد في الذاكرة هي أنه لكل موضوع أحمله في الذاكرة، يتم أيضًا تنفيذ جلب لفئة (category) ومستخدم (user) ومنشور (post).
أعمل مع 1000-2000 موضوع لكل فئة، ولدي 4 فئات أحتاج لجلب البيانات منها.
يتم تنفيذ الجلب بواسطة جميع المستخدمين، وليس مرة واحدة فقط.
كما أرى، لدي طريقتان للقيام بذلك حتى الآن (الطريقة الأولى لا تبدو سريعة بما يكفي بالنسبة لي):
- الحصول على معرفات (IDs) فقط لجميع المواضيع التي أهتم بها في طلب واحد، ثم استخدام هذه المعلومات بطريقة ما للربط مع قيمة ‘importedSortDate’، ثم إجراء الفرز في الذاكرة، ثم إجراء جلب آخر للمعرفات بنفس الترتيب الذي لدي فيه (مرة أخرى، لا أعرف حقًا كيف ستعمل هذه العملية بالضبط).
- إنشاء استعلام يربط بجدول الحقول المخصصة (لقد رأيت بعض الأمثلة لكنها كانت لقيم ثابتة في أعمدة الاسم والقيمة) وفرز كل هذا بناءً على الأعمدة حيث ‘name’ === ‘importedSortDate’ وعمود القيمة (سلسلة ISO8601).
كيف يمكنني تحقيق ذلك؟
ملاحظة: بعض المواضيع قد لا تحتوي على قيمة في الحقل المخصص ‘importedSortDate’، لذا يمكنني مجرد جلبها ووضعها حيثما أريد، لكنها حالة هامشية يمكنني التعامل معها. إذا لم تكن تحتوي على قيمة، فيجب أن تكون هي الإدخالات الأولى.
ملاحظة إضافية: أريد استخدام هذا الاستعلام لاحقًا كاستعلام للترقيم (pagination)، حيث أن المنطق مُنفذ بالفعل في هذا الجانب، أنا فقط بحاجة إلى تغيير الاستعلام الرئيسي لجلب المواضيع.