ACTIVERECORD :: eagerloadpolymorphicerror: لا يمكن تحميل ارتباط متعدد الأشكال بفارغ الصبر

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

سؤال

class Transaction < ActiveRecord::Base
  belongs_to :account, :polymorphic => true
end

class Bankaccount < ActiveRecord::Base
  has_many :transactions, :as => :account
end

class Creditcard < ActiveRecord::Base
  has_many :transactions, :as => :account
end

محاولة إجراء ملخص للمعاملات حيث يكون الحساب نشطًا.

Transaction.sum(:all, :conditions => "account.status = 'active'", :include => :account)

لذا ، بعد بعض القراءة ، صادفت هذا: السبب هو أن نوع النموذج الأصل هو قيمة عمود ، لذا لا يمكن وضع اسم الجدول المقابل في جمل/انضمام إلى هذا الاستعلام. اسم الجدول هو BankAccounts و Creditcards ، فهل هذا يعني أنه ينبغي أن يكونوا فرديين؟ أيضا account_type هي سلسلة إما BankAccount أو CreditCard لتعكس النموذج ولكن هل يجب أن يكون اسم Tablename بدلاً من ذلك؟

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

المحلول

هناك نوعان من القضايا هنا:

  1. تلخيص جمعية متعددة الأشكال.
  2. حالة على ارتباط متعدد الأشكال.

لا يمكنك فعل أي من هذه الأشياء. لذلك يجب أن تحصل على نفس الخطأ من خلال تنفيذ هذين الاستفسارات:

  1. المعاملات.
  2. المعاملات.

للحصول على المعلومات التي تحتاجها فعليًا ، يجب عليك إدراج الجمعيات المتعددة الأشكال الوالدية بشكل صريح. طريقة واحدة للقيام بذلك هي ببساطة استخدام SQL والوصول اليسار ، بحيث يمكنك استخدام استعلام واحد. باستخدام القضبان ، يمكن تنفيذ هذا مع استفسارين:

Creditcard.sum(
  :all, 
  :select => "transactions.amount", 
  :conditions => "creditcards.status = 'active'", 
  :joins => :transaction
) + Bankaccount.sum(
  :all, 
  :select => "transactions.amount", 
  :conditions => "bankaccounts.status = 'active'", 
  :joins => :transaction
)

ملاحظة: من الأفضل استخدام: انضم بدلاً من: قم بتضمين إذا كنت لا تخطط للوصول إلى الكائنات المرتبطة بعد الاستعلام.

نصائح أخرى

إضافي لإجابة بان ، يمكنك حتى القيام بالاتحاد بدلاً من إضافتها. الذي ينفذ استعلام واحد فقط

بالنسبة لأولئك الذين حصلوا على هذا الخطأ حتى عندما لا يحاولون الاستعلام عن شروط في جمعية الأشكال المتعددة ، فإن ذلك يرجع إلى أن هناك قرارًا بالاتصال بـ eager_load عندما يتم دعم جمعيات الأشكال المتعددة فقط بواسطة التحميل المسبق. إنه في الوثائق هنا: http://api.rubyonrails.org/v5.1/classes/activerecord/eagerpolypolymorphicerror.html

لذلك يجب عليك دائمًا استخدام التحميل المسبق للجمعيات المتعددة الأشكال.

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