Carriles clase Nombre / tipo que no trabaja para una has_many polimórfica: a través
-
22-09-2019 - |
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.
- Factura
- Elemento de línea
- débito
- 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í?
Solución
Se está declarando asociaciones ambigua en su clase LineItem
.
En pocas palabras, belongs_to
hace esto en su clase:
-
belongs_to :invoice
crea unainvoice
método que busca en el facturas mesa para un registro al que hace referenciainvoice_id
-
belongs_to :recordable, :polymorphic => true
crea unarecordable
método que busca en la tablarecordable_type.underscore.pluralize
para un registro al que hace referenciarecordable_id
-
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
crea unacredit
método que busca a través de los créditos mesa para un registro al que hace referenciarecordable_id
. Tenga en cuenta, querecordable_type
se tiene en cuenta aquí. - 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.