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.

  1. Fattura
  2. Elemento
  3. Debito
  4. 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?

È stato utile?

Soluzione

si dichiara associazioni ambiguo sulla tua classe LineItem.

In poche parole, belongs_to fa questo nella tua classe:

  1. belongs_to :invoice crea un metodo che cerca invoice fatture tavolo per un record a cui fa riferimento invoice_id
  2. belongs_to :recordable, :polymorphic => true crea un metodo recordable che cerca la tavola recordable_type.underscore.pluralize per un record a cui fa riferimento recordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" crea un metodo credit che cerca attraverso i crediti tavolo per un record a cui fa riferimento recordable_id. Si noti, che recordable_type viene ignorata qui.
  4. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top