اسم فئة القضبان/النوع لا يعمل مع تعدد الأشكال HAS_MANY: من خلال

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

سؤال

لدي نظام فاتورة يدير الديون والائتمانات. في الأساس يتم الحصول على مبلغ الفاتورة من خلال مجموع ديونه ويتم اشتقاق الرصيد من خلال أخذ مجموع ائتماناته وطرحه مقابل المبلغ الإجمالي.

أنا أفعل هذا مع أربعة نماذج.

  1. فاتورة
  2. خط سلعة
  3. مدين
  4. الإئتمان

الطريقة التي تعمل بها عبر نموذج انضمام (عنصر السطر) يحتوي على جمعية متعددة الأشكال تسمى 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 هل هذا في صفك:

  1. belongs_to :invoice يخلق طريقة invoice الذي يبحث في فواتير جدول لسجل مشار إليه من قبل invoice_id
  2. belongs_to :recordable, :polymorphic => true يخلق طريقة recordable الذي يبحث في recordable_type.underscore.pluralize جدول لسجل مشار إليه من قبل recordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" يخلق طريقة credit الذي يبحث من خلال اعتمادات جدول لسجل مشار إليه من قبل recordable_id. لاحظ أن recordable_type يتم تجاهله هنا.
  4. الشيء نفسه ينطبق على belongs_to :debit على التوالى.

نظرًا لأن LineItem قد ينتمي فقط إلى أي رصيد أو الخصم ، ليس من المنطقي إعلان هذه الجمعيات بالإضافة إلى ذلك. يمكنك الرجوع إلى هذه عبر recordable جمعية.

نصائح أخرى

فاتورة. last.credits << credit.new

هذه هي الطريقة الصحيحة في تعيين الجمعيات إلى أنا مهتمة لماذا recordable_type لا يتم التقاطها.

التمسك بالقش هنا ولكن هل حاولت:

Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)

لقد واجهت شخصياً مشاكل عند استخدام العديد من الجداول في القضبان ، والتي تم حلها في كثير من الأحيان باستخدام has_many_polymorphs توصيل في.

آسف لأن هذا لا يجيب مباشرة على سؤالك.

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