Pregunta

Tengo un sistema de facturación que administra los débitos y créditos. Básicamente, el importe de la factura se obtiene por la suma de sus débitos y el equilibrio se obtiene tomando la suma de sus créditos y restarlo contra de la cantidad total.

Estoy haciendo esto con cuatro modelos.

  1. Factura
  2. Elemento de línea
  3. débito
  4. Crédito

La forma en que funciona es a través de una combinación de modelo (de partidas individuales) que tiene una asociación polimórfica denominada grabable. Todo parece funcionar adecuadamente a primera vista. Sin embargo, la inspección de los espectáculos de partidas individuales que, si bien los espectáculos recordable_id hasta bien, la recordable_type es nula.

Aquí hay una ruptura hacia abajo del código:

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

me puede punto cualquiera en la dirección correcta aquí?

¿Fue útil?

Solución

Se está declarando asociaciones ambigua en su clase LineItem.

En pocas palabras, belongs_to hace esto en su clase:

  1. belongs_to :invoice crea una invoice método que busca en el facturas mesa para un registro al que hace referencia invoice_id
  2. belongs_to :recordable, :polymorphic => true crea una recordable método que busca en la tabla recordable_type.underscore.pluralize para un registro al que hace referencia recordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" crea una credit método que busca a través de los créditos mesa para un registro al que hace referencia recordable_id. Tenga en cuenta, que recordable_type se tiene en cuenta aquí.
  4. mismo se aplica a belongs_to :debit respectivamente.

Debido a que su LineItem puede solamente pertenecen ya sea a un crédito o un débito que no tiene sentido para declarar estas asociaciones, además. Se puede hacer referencia a éstas a través de la asociación recordable.

Otros consejos

Invoice.last.credits << Credit.new

Esta es la forma correcta en la asignación de las asociaciones a que estoy confundido en cuanto a por qué el recordable_type no está siendo recogido.

agarrándose a un clavo ardiendo, pero has necesitado:

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

he tenido personalmente problemas al utilizar multi-tipo muchos-a-muchos se unen las tablas de rieles, que a menudo se resuelven mediante el uso de la has_many_polymorphs plug-in.

Lo sentimos que este no responde directamente a su pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top