5

Tengo un sistema de facturación que gestiona débitos y créditos. Básicamente, el monto de la factura se obtiene por la suma de sus débitos y el saldo se obtiene tomando la suma de sus créditos y restando la cantidad total.Rails nombre/tipo de clase que no funciona para un hashman polimórfico: a través de

Estoy haciendo esto con cuatro modelos.

  1. factura
  2. de partidas individuales
  3. débito
  4. crédito

La forma en que funciona es a través de un modelo de unirse (Elemento de línea) que tiene una asociación polimórfica llamados grabable. Todo parece funcionar correctamente a primera vista. Sin embargo, al inspeccionar la línea de pedido, se muestra que, si bien el elemento grabable se muestra bien, el tipo grabable es nulo.

Aquí hay un desglose 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 

¿Puede alguien me punto en la dirección correcta aquí?

+0

¿Cómo se asigna line_items a Credit/Debit? – Nazar

+0

Esto sucede automáticamente a través de has_many: through. Por lo tanto, cuando ejecute Invoice.last.credits << Credit.new, LineItem se genera automáticamente y se genera con la derecha recordable_id y invoice_id. –

+0

¿No debería el ': as' estar en' has_many: line_items', no las asociaciones 'has_many: through'? – mckeed

Respuesta

3

Usted está declarando asociaciones ambiguas en su clase LineItem.

En pocas palabras, belongs_to hace esto en su clase:

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

Desde su LineItem solamente puede pertenecer a cualquiera de Crédito o un débito que no tiene sentido para declarar estas asociaciones, además. Puede consultar estos a través de la asociación recordable.

0

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:

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

que he tenido personalmente problemas al utilizar multi-tipo muchos-a-muchos se unen las tablas de rieles, que a menudo se resuelven usando el plugin has_many_polymorphs .

Disculpa que esto no responde directamente tu pregunta.

+0

Sí, terminé simplemente creando una relación directa ya que el comportamiento de la aplicación ya no necesitaba la relación de facturas a débitos de muchos a muchos. Aunque no estoy seguro de por qué no lo está entendiendo. He hecho la misma configuración exacta para diferentes objetos en el pasado. Tal vez me encontré con un nombre protegido, pero no puedo pensar en eso. Originalmente estaba usando item_id y item_type, pero incluso después de cambiar a recordable_id y escribirlo todavía no funcionaba. Completamente perplejo. –

Cuestiones relacionadas