Rails nome della classe / tipo non funziona per un has_many polimorfa: attraverso
-
22-09-2019 - |
Domanda
Ho un sistema di fatturazione che gestisce debiti e crediti. Fondamentalmente l'importo della fattura è ottenuta dalla somma dei suoi debiti e il saldo viene calcolato sulla base della somma dei suoi crediti e sottraendo contro l'importo totale.
che sto facendo questo con quattro modelli.
- Fattura
- Elemento
- Debito
- di credito
Il modo in cui funziona è attraverso un modello di unirsi (voce), che ha un'associazione polimorfica denominata registrabile. Tutto sembra funzionare correttamente a prima vista. Tuttavia, controllando la voce mostra che mentre la recordable_id si presenta bene, il recordable_type è pari a zero.
Qui è una ripartizione del codice:
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
Qualcuno mi può punto nella giusta direzione qui?
Soluzione
si dichiara associazioni ambiguo sulla tua classe LineItem
.
In poche parole, belongs_to
fa questo nella tua classe:
-
belongs_to :invoice
crea un metodo che cercainvoice
fatture tavolo per un record a cui fa riferimentoinvoice_id
-
belongs_to :recordable, :polymorphic => true
crea un metodorecordable
che cerca la tavolarecordable_type.underscore.pluralize
per un record a cui fa riferimentorecordable_id
-
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
crea un metodocredit
che cerca attraverso i crediti tavolo per un record a cui fa riferimentorecordable_id
. Si noti, cherecordable_type
viene ignorata qui. - stesso vale per
belongs_to :debit
rispettivamente.
Dal momento che il LineItem può appartenere solo a uno un credito o di un debito non ha senso dichiarare queste associazioni in aggiunta. È possibile fare riferimento a queste tramite l'associazione recordable
.
Altri suggerimenti
Invoice.last.credits << Credit.new
Questo è il modo corretto di assegnazione di associazioni per stumped sul motivo per cui il recordable_type
non viene raccolto.
arrampicarsi sugli specchi qui, ma hai provato:
Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)
Ho personalmente avuto problemi quando si utilizzano più di tipo molti-a-molti unire le tabelle in Rails, che è stato spesso risolto utilizzando il plugin di has_many_polymorphs
.
Ci dispiace che questo non risponde direttamente alla tua domanda.