5

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.

  1. Faktura
  2. Linia Element
  3. Debit
  4. 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?

+0

W jaki sposób przypisujesz line_items do kredytu/debetu? – Nazar

+0

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. –

+0

Czy nie powinno być ': as' na' has_many: line_items', a nie stowarzyszeniach 'has_many: through'? – mckeed

Odpowiedz

3

Zgłaszasz niepoprawne skojarzenia na swojej klasie LineItem.

W skrócie, belongs_to robi to w swojej klasie:

  1. belongs_to :invoice tworzy metodę invoice który przeszukuje faktur tabeli rekordu odwołuje invoice_id
  2. belongs_to :recordable, :polymorphic => true tworzy metodę recordable który przeszukuje recordable_type.underscore.pluralize Tabela dla rekordu, do którego odwołuje się recordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" tworzy spotkanie hod credit, który przeszukuje tabelę 10 dla rekordu, do którego odwołuje się recordable_id. Zauważ, że recordable_type jest tutaj ignorowane.
  4. to samo dotyczy odpowiednio belongs_to :debit.

Ponieważ elementu zamówienia może należeć tylko do jednej Credit lub debetowej nie ma sensu do stwierdzenia te skojarzenia dodatkowo. Możesz się do nich odwoływać za pośrednictwem stowarzyszenia recordable.

0

Invoice.last.credits < < Credit.new

Jest to poprawny sposób przypisywania stowarzyszeniom jestem zakłopotany, dlaczego recordable_type nie jest podejmowany.

Ściskając się brzytwy tutaj, ale czy próbowałeś:

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

Ja osobiście miałem problemy przy użyciu wielofunkcyjnego typu wiele-do-wielu łączenia tabel w szynach, które często rozwiązane za pomocą wtyczki has_many_polymorphs .

Przepraszamy, ale to nie odpowiada bezpośrednio na Twoje pytanie.

+0

Tak, skończyłem właśnie tworząc bezpośrednią relację, ponieważ zachowanie aplikacji nie wymagało już wielu do wielu relacji faktur z obciążeniami. Nie jestem pewien, dlaczego tak się nie dzieje. Zrobiłem dokładnie taką samą konfigurację dla różnych obiektów w przeszłości. Może natknąłem się na chronione nazwisko, ale nie mogę o tym myśleć. Pierwotnie używałem item_id i item_type, ale nawet po zmianie na recordable_id i wpisaniu go nadal nie działa. Całkowicie zakłopotany. –

Powiązane problemy