اسم فئة القضبان/النوع لا يعمل مع تعدد الأشكال HAS_MANY: من خلال
-
22-09-2019 - |
سؤال
لدي نظام فاتورة يدير الديون والائتمانات. في الأساس يتم الحصول على مبلغ الفاتورة من خلال مجموع ديونه ويتم اشتقاق الرصيد من خلال أخذ مجموع ائتماناته وطرحه مقابل المبلغ الإجمالي.
أنا أفعل هذا مع أربعة نماذج.
- فاتورة
- خط سلعة
- مدين
- الإئتمان
الطريقة التي تعمل بها عبر نموذج انضمام (عنصر السطر) يحتوي على جمعية متعددة الأشكال تسمى Recordable. يبدو أن كل شيء يعمل بشكل صحيح للوهلة الأولى. ومع ذلك ، فإن فحص عنصر السطر يوضح أنه على الرغم من أن التسجيلات القابلة للتسجيل على ما يرام ، فإن التسجيل القابل للتسجيل هو لا شيء.
فيما يلي كسر في الكود:
class Invoice < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
has_many :debits, :through => :line_items, :as => :recordable
has_many :credits, :through => :line_items, :as => :recordable
end
class LineItem < ActiveRecord::Base
belongs_to :invoice
belongs_to :recordable, :polymorphic => true
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
belongs_to :debit, :class_name => "Debit", :foreign_key => "recordable_id"
end
class Credit < ActiveRecord::Base
has_many :line_items, :as => :recordable, :dependent => :destroy
end
class Debit < ActiveRecord::Base
has_many :line_items, :as => :recordable, :dependent => :destroy
end
هل يمكن لأي شخص أن يوجهني إلى الاتجاه الصحيح هنا؟
المحلول
أنت تعلن الجمعيات الغامضة الخاصة بك LineItem
صف دراسي.
شيء صغير، belongs_to
هل هذا في صفك:
belongs_to :invoice
يخلق طريقةinvoice
الذي يبحث في فواتير جدول لسجل مشار إليه من قبلinvoice_id
belongs_to :recordable, :polymorphic => true
يخلق طريقةrecordable
الذي يبحث فيrecordable_type.underscore.pluralize
جدول لسجل مشار إليه من قبلrecordable_id
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
يخلق طريقةcredit
الذي يبحث من خلال اعتمادات جدول لسجل مشار إليه من قبلrecordable_id
. لاحظ أنrecordable_type
يتم تجاهله هنا.- الشيء نفسه ينطبق على
belongs_to :debit
على التوالى.
نظرًا لأن LineItem قد ينتمي فقط إلى أي رصيد أو الخصم ، ليس من المنطقي إعلان هذه الجمعيات بالإضافة إلى ذلك. يمكنك الرجوع إلى هذه عبر recordable
جمعية.
نصائح أخرى
فاتورة. last.credits << credit.new
هذه هي الطريقة الصحيحة في تعيين الجمعيات إلى أنا مهتمة لماذا recordable_type
لا يتم التقاطها.
التمسك بالقش هنا ولكن هل حاولت:
Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)
لقد واجهت شخصياً مشاكل عند استخدام العديد من الجداول في القضبان ، والتي تم حلها في كثير من الأحيان باستخدام has_many_polymorphs
توصيل في.
آسف لأن هذا لا يجيب مباشرة على سؤالك.