هل توفر مجموعة Ruby on Rails "HAS_MANY" بيانات على أساس "الحاجة إلى معرفة"؟

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

سؤال

على Ruby on Rails ، على سبيل المثال ، إذا كان كائن نموذج الممثل هو Tom Hanks ، وعشاق "HAS_MANY" هو 20.000 كائن من المعجبين ، بعد ذلك

actor.fans

يعطي صفيف مع 20،000 عنصر. ربما ، العناصر غير محظورة مسبقًا بالقيم؟ خلاف ذلك ، يمكن أن يكون الحصول على كل كائن ممثل من ديسيبل مضيعة للوقت للغاية.

إذن هو على أساس "الحاجة إلى معرفة"؟

فهل يسحب البيانات عندما أقوم بالوصول إلى Actor.Fans [500] ، وسحب البيانات عندما أقوم بالوصول إلى Actor.Fans [0]؟ إذا قفز من كل سجل إلى سجل ، فلن يكون قادرًا على تحسين الأداء عن طريق القيام بقراءة متسلسلة ، والتي يمكن أن تكون أسرع على القرص الصلب لأن هذه السجلات يمكن أن تكون في طبقة القطاع / الطبق القريب - على سبيل المثال ، إذا يمس البرنامج عنصرين عشوائيين ، ثم سيكون أسرع فقط لقراءة هذين السجلين ، ولكن ماذا لو كان يمس جميع العناصر بترتيب عشوائي ، ثم قد يكون أسرع فقط لقراءة جميع السجلات بطريقة متتابعة ، ثم معالجة العشوائية عناصر. ولكن كيف ستعرف رور ما إذا كنت أفعل سوى عدد قليل من العناصر العشوائية أو جميع العناصر بشكل عشوائي؟

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

المحلول

لماذا تريد إحضار سجلات 50000 إذا كنت تستخدم فقط 2 منها؟ ثم جلب هذين فقط من ديسيبل. إذا كنت ترغب في إدراج المشجعين ، فربما ستستخدم ترقيم الصفحات - أي استخدام الحد والإزاحة في استعلامك ، أو بعض جوهرة الصفحات مثل Will_Paginate.

لا أرى أي تفسير منطقي لماذا يجب أن تذهب بالطريقة التي تحاول بها. اشرح موقفًا حقيقيًا حتى نتمكن من مساعدتك.

ومع ذلك ، فهناك واحد يعتقد أنك بحاجة إلى معرفة Wile لتحميل العديد من الكائنات المرتبطة بها من DB - الاستخدام: قم بتضمين مثل

Actor.all(:include => :fans)

سيؤدي ذلك إلى تحميل جميع المعجبين ، لذا لن يكون هناك سوى استفسارين بدلاً من N+1 ، حيث N هي كمية من الممثلين

نصائح أخرى

انظر إلى SQL الذي ينشره الخادم في وضع التطوير ، وهذا سيخبرك بعدد سجلات المعجبين التي يتم تحميلها. في هذه الحالة actor.fans سيؤدي بالفعل إلى تحميلهم جميعًا ، وهو ما لا تريده على الأرجح.

لديك العديد من الخيارات:

  • استخدم paginator كما اقترح Tadas.
  • قم بإعداد ارتباط آخر مع جدول المعجبين الذي يسحب فقط تلك التي تهتم بها. يمكن القيام بذلك إما مع شروط في بيان HAS_MANY ، على سبيل المثال
    has_many :fans, :conditions => "country of residence = 'UK'"
  • تحديد SQL الكامل لتضييق الصفوف التي تم إرجاعها مع :finder_sql اختيار
  • تحديد :limit الخيار الذي سيحدد ، عدد الصفوف التي تم إرجاعها.

كل ذلك يتوقف على ما تريد القيام به.

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