我有一个管理借方和贷方的发票系统。基本上,发票金额是通过其借方总和获得的,余额是通过取其贷方总额并将其减去总金额得出的。
我正在用四种模式做这件事。
它的工作方式是通过一个连接模型(Line Item),它具有一个名为recordable的多态关联。乍一看似乎一切正常。 但是,检查订单项会显示,当recordable_id显示正常时,recordable_type为nil。
以下是代码的细分:
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
有人能指出我正确的方向吗?
答案 0 :(得分:3)
您在LineItem
班级宣布了暧昧关联。
简而言之,belongs_to
在您的班级中执行此操作:
belongs_to :invoice
创建方法invoice
,在发票表中搜索invoice_id
引用的记录belongs_to :recordable, :polymorphic => true
创建方法recordable
,在recordable_type.underscore.pluralize
表中搜索recordable_id
引用的记录belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
创建一个方法credit
,在{em> credits 表中搜索recordable_id
引用的记录。请注意,此处忽略recordable_type
。 belongs_to :debit
。由于您的LineItem可能只属于Credit 或借记,因此另外声明这些关联是没有意义的。您可以通过recordable
关联来引用这些内容。
答案 1 :(得分:0)
Invoice.last.credits&lt;&lt; Credit.new
这是分配关联的正确方法,我很难理解为什么recordable_type
没有被选中。
抓住稻草,但你试过了吗?
Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)
在Rails中使用多类型多对多连接表时,我个人遇到了问题,这通常是使用has_many_polymorphs
插件解决的。
很抱歉,这不能直接回答您的问题。