Mam system fakturowania, który zarządza obciążeniami i kredytami. Zasadniczo kwota faktury jest uzyskiwana przez sumę jej obciążeń, a saldo jest obliczane przez pobranie sumy kredytów i odjęcie jej od łącznej kwoty.Nazwa/typ klasy Railsy nie działa dla polimorficznego has_many: through
Robię to z czterema modelami.
- Faktura
- Linia Element
- Debit
- Kredyt
Jak to działa jest za pośrednictwem przyłączenia modelu (linia Element), który ma polimorficzny stowarzyszenie o nazwie możliwych do zapisania. Wszystko wydaje się działać prawidłowo na pierwszy rzut oka. Jednak sprawdzanie elementu zamówienia pokazuje, że podczas gdy recordable_id pokazuje się poprawnie, recordable_type ma wartość nil.
Oto rozbicie kodu:
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
Czy ktoś może wskazać mi w dobrym kierunku tutaj?
W jaki sposób przypisujesz line_items do kredytu/debetu? – Nazar
Dzieje się to automatycznie za pośrednictwem has_many: through. Więc kiedy robisz Invoice.last.credits << Credit.new, LineItem jest automatycznie generowany i budowany z prawami recordable_id i invoice_id. –
Czy nie powinno być ': as' na' has_many: line_items', a nie stowarzyszeniach 'has_many: through'? – mckeed