ACTIVERECORD :: eagerloadpolymorphicerror: لا يمكن تحميل ارتباط متعدد الأشكال بفارغ الصبر
-
21-09-2019 - |
سؤال
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 بدلاً من ذلك؟
المحلول
هناك نوعان من القضايا هنا:
- تلخيص جمعية متعددة الأشكال.
- حالة على ارتباط متعدد الأشكال.
لا يمكنك فعل أي من هذه الأشياء. لذلك يجب أن تحصل على نفس الخطأ من خلال تنفيذ هذين الاستفسارات:
- المعاملات.
- المعاملات.
للحصول على المعلومات التي تحتاجها فعليًا ، يجب عليك إدراج الجمعيات المتعددة الأشكال الوالدية بشكل صريح. طريقة واحدة للقيام بذلك هي ببساطة استخدام 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
لذلك يجب عليك دائمًا استخدام التحميل المسبق للجمعيات المتعددة الأشكال.