Schienen Klassennamen / Typ nicht für eine polymorphe has_many arbeiten: durch
-
22-09-2019 - |
Frage
ich ein Abrechnungssystem haben, die Belastungen und Gutschriften verwaltet. Grundsätzlich ist der Rechnungsbetrag von der Summe seiner Belastungen erhalten wird, und das Gleichgewicht, indem die Summe der Gutschriften abgeleitet ist und gegen die Gesamtmenge subtrahiert wird.
Ich tue dies mit vier Modellen.
- Rechnung
- Line Item
- Soll
- Kredit
Die Funktionsweise ist über ein Modell (Einzelposten) verbinden, die eine polymorphe Vereinigung namens beschreibbare. Alles scheint richtig auf den ersten Blick zu arbeiten. Um jedoch die Position zeigt Inspektion, dass, während die recordable_id zeigt sich in Ordnung, die recordable_type ist gleich Null.
Hier ist ein Zusammenbruch des Code:
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
Kann jemand Punkt mich in die richtige Richtung hier?
Lösung
Sie deklarieren mehrdeutig Verbände auf Ihrer LineItem
Klasse.
Auf den Punkt gebracht, belongs_to
tut dies in Ihrer Klasse:
-
belongs_to :invoice
schafft ein Verfahreninvoice
, die die Rechnungen Tabelle für einen Datensatz voninvoice_id
verwiesen sucht
-
belongs_to :recordable, :polymorphic => true
schafft ein Verfahrenrecordable
, die dierecordable_type.underscore.pluralize
Tabelle für einen Datensatz vonrecordable_id
verwiesen sucht
-
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
schafft ein Verfahrencredit
die Suche durch die Kredite Tabelle für einen Datensatz vonrecordable_id
verwiesen. Beachten Sie, dassrecordable_type
wird hier ignoriert. - Gleiches gilt jeweils
belongs_to :debit
.
Da Ihr LineItem nur, gehören entweder zu einem Kredit oder ein Debit macht es keinen Sinn, diese Assoziationen zu erklären zusätzlich. Sie können über die recordable
Verband auf diese beziehen.
Andere Tipps
Invoice.last.credits << Credit.new
Dies ist der richtige Weg, Verbände bei der Zuordnung zu ich bin ratlos, warum die recordable_type
nicht abgeholt wird.
Clutching an Strohhalme hier aber haben Sie versucht:
Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)
Ich habe persönlich hatte Probleme, wenn Multi-Typ mit many-to-many verbinden Tabellen in Rails, die oft mit der has_many_polymorphs
Plugin.
Es tut uns Leid, dass dies nicht direkt Ihre Frage beantworten.